通过多列排列对数据框中的行重新排序

标签 r

我正在尝试重新排序包含大约 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)] 来测试特定行的订单所需子集何时等于所需订单所需子集。(我认为 sapplywhichall 的某种组合)

确定与所需结果匹配的所有行后,您可以使用 setdiff 查找不匹配的行,然后使用此 tt 向量对 new order 重新排序。

关于通过多列排列对数据框中的行重新排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14270159/

相关文章:

R data.table 创建映射现有列的虚拟列

r - 查找数据框中的第一个非零出现

r - 如何使用Knitr使表格标题加粗(用于pdf输出)?

r - 使用 dplyr 有条件地替换列中的值

r - 为数据框分配一个因子

r - 如果/否则如果在 R 中的文本列上

r - 在 Shiny 中输入更改时切换到不同的 DataTable 页面?

R/量子模组 : how to specify the bollinger bands colour?

r - 使用 httr 通过 Travis-CI 在 Github 进行身份验证以及本地身份验证(本地有效,远程无效)

r - 在 R 中显示变量的精确值