我有一个从递归左连接动态生成的数据帧,当我事先不知道列数时,如何使用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]
,但如果我不知道列数怎么办呢?
答案 0 :(得分:2)
在循环中创建类似A[,1],A[,2],A[,3],A[,4]
的字符串,然后使用parse
和eval
函数来评估您的表达式。
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 = ",")
我觉得功能化它很酷,我可以稍微添加到这篇文章