我正在尝试重新排序包含大约 250,000 行和 7 列的 data.frame
。我想要在 data.frame
顶部的行是第 2 列包含最低值和第 7 列最高值的行,但会按包含最低到最高值的列顺序排列:2 ,5,1,4,6,3,7(因此第 5 列将具有第二低值等)。
一旦识别出与该序列匹配的任何行,它将继续查找列值按序列 2,5,1,4,6 从最低到最高的行,然后是 2,5,1,4 和依此类推,直到只有第 2 列最低的行和其他列值随机分类。任何不将第 2 列作为最低值的行都将被忽略,并在已排序的行下方保留未排序状态。我正在努力想出任何可行的解决方案来解决我的问题 - 在提供与我正在使用的类似数据方面我能做的最好的事情是:
df<-data.frame(matrix(rnorm(70000), nrow=10000))
df<-abs(df)
如果有人有任何想法,我会洗耳恭听。 谢谢!
最佳答案
鉴于您有一个较大的统一类型(数字)数据集,我建议使用矩阵而不是 data.frame
tt <- abs(matrix(rnorm(70000), nrow=10000))
您有一个想要匹配的订单
desiredOrder <- c(2,5,1,4,6,3,7)
您需要找到每一行的顺序。我认为这里最简单的方法是确保为您提供一个列表,其中每行都有一个元素。我建议这样的事情。
orders <- lapply(apply(tt, 1, function(x) list(order(x))), unlist)
然后,您需要遍历(从 desiredOrder[seq_len(7)]
到 desiredOrder[seq_len(1)]
来测试特定行的订单所需子集何时等于所需订单所需子集。(我认为 sapply
与 which
和 all
的某种组合)
确定与所需结果匹配的所有行后,您可以使用 setdiff
查找不匹配的行,然后使用此 tt
向量对 new order
重新排序。
关于通过多列排列对数据框中的行重新排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14270159/