当您不知道列数时,使用所有列对包含订单的矩阵进行排序

时间:2017-11-19 08:14:38

标签: r

我有一个从递归左连接动态生成的数据帧,当我事先不知道列数时,如何使用order函数应用于所有列?我希望结果首先排在第一列,然后排在第二列......

在下面的示例中,我有四列

set.seed(123)
A <- matrix(rep(1:25,4)[order(rnorm(100))],ncol=4)
B <- A[order(A[,1],A[,2],A[,3],A[,4],decreasing=TRUE),]

所以我写了这个A[,1],A[,2],A[,3],A[,4],但如果我不知道列数怎么办呢?

2 个答案:

答案 0 :(得分:2)

在循环中创建类似A[,1],A[,2],A[,3],A[,4]的字符串,然后使用parseeval函数来评估您的表达式。

set.seed(123)
A <- matrix(rep(1:25,4)[order(rnorm(100))],ncol=4)
col <- ""
for (i in 1:ncol(A)){
  col <- paste(col,paste0('A[,',i,']'), sep = ",")
}
## remove first comma
col <- substr(col, 2, nchar(col))
col
[1] "A[,1],A[,2],A[,3],A[,4]"
B <- eval(parse(text = paste("A[order(",col,",decreasing=TRUE),]")))

答案 1 :(得分:1)

我接受了格劳德的回答并添加了一些调整:

你可以在不使用for循环的情况下在一行中完成整个过程。

eval(parse(text = paste("A[order(",paste(paste0("A[,",1:ncol(A1),"]"), collapse = ","),",decreasing=TRUE),]")))

以下位将为您提供列的列表(然后我将其替换为Glaud的col for循环):

paste(paste0("A[,",1:ncol(A1),"]"), collapse = ",")

我觉得功能化它很酷,我可以稍微添加到这篇文章