如何在事先不知道列的情况下按所有列对数据框(在 R Base 中)进行排序

问题描述 投票:0回答:1

我有一个带有许多固定列的数据框, 后跟可变数量的列,具体取决于输入。

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.

问:如何在事先不知道列的情况下按(选择的)所有列对数据框进行排序。

例如:

  • 按所有列对数据框进行排序。
  • 按 key1 和最后 n 列对数据框进行排序。
r dataframe sorting
1个回答
0
投票

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
© www.soinside.com 2019 - 2024. All rights reserved.