我有一个带有许多固定列的数据框, 后跟可变数量的列,具体取决于输入。
dd <- data.frame(key1=c("NED", "LTU", "LAT", "ITA"), h=c(18, 3, 2, 59)) # Two columns.
dd <- rbind(dd, dd, dd) # example dataframe.
# Append a random number of auxiliary columns, ak1, ak2, ...
set.seed(2024); n <- sample(4:8, size=1) # number of aux. columns.
akeys <- matrix(sample(x=c(1,2,3), size=nrow(dd) * n, replace=TRUE),
ncol=n
) # with random values 1..3.
colnames(akeys) <- paste0("ak", seq(n)) # column names: ak1, ak2, ...
d2 <- cbind(dd, akeys) # append n columns for sorting.
# Assuming n = 5.
d3 <- d2[order(d2$key1, d2$h, d2$ak1, d2$ak2, d2$ak3, d2$ak4, d2$ak5),] # Sort all columns by name.
d4 <- d2[order(d2[,1], d2[,2], d2[,3], d2[,4], d2[,5], d2[,6], d2[, 7]), ] # Sort by column number.
问:如何在事先不知道列的情况下按(选择的)所有列对数据框进行排序。
例如:
将
order
与 do.call
一起使用。
> d2[do.call('order', d2), ]
key1 h ak1 ak2 ak3 ak4 ak5
12 ITA 59 1 2 1 1 1
4 ITA 59 1 2 3 1 1
8 ITA 59 2 1 3 3 3
7 LAT 2 2 1 2 1 1
11 LAT 2 3 1 3 2 3
3 LAT 2 3 2 2 1 3
6 LTU 3 1 2 1 2 2
2 LTU 3 1 2 3 1 1
10 LTU 3 1 3 1 1 2
1 NED 18 1 2 1 2 3
5 NED 18 1 2 3 2 2
9 NED 18 3 3 1 1 1