Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 如何按列对数据帧进行排序,列名称作为变量_R_Sorting_Dataframe - Fatal编程技术网

R 如何按列对数据帧进行排序,列名称作为变量

R 如何按列对数据帧进行排序,列名称作为变量,r,sorting,dataframe,R,Sorting,Dataframe,我需要按几列对数据帧进行排序,并且在变量中有列的名称。 我的问题与有关,但在我的例子中,用于排序的列存储在变量中,如中 我借用第一个问题的数据框架: dd <- data.frame(b = factor(c("Hi", "Med", "Hi", "Low"), levels = c("Low", "Med", "Hi"), ordered = TRUE), x = c("A", "D", "A", "C"), y = c(8, 3, 9, 9), z

我需要按几列对数据帧进行排序,并且在变量中有列的名称。 我的问题与有关,但在我的例子中,用于排序的列存储在变量中,如中

我借用第一个问题的数据框架:

dd <- data.frame(b = factor(c("Hi", "Med", "Hi", "Low"), 
      levels = c("Low", "Med", "Hi"), ordered = TRUE),
      x = c("A", "D", "A", "C"), y = c(8, 3, 9, 9),
      z = c(1, 1, 1, 2))
dd
    b x y z
1  Hi A 8 1
2 Med D 3 1
3  Hi A 9 1
4 Low C 9 2
我得到的是:

sort_list <- c("z","b")
但这只给了我两个变量的递增顺序。我搞不懂的是如何按降序进行。我试过这个:

dd[do.call(order, list(dd[, sort_list]), decreasing = c(TRUE,FALSE)),]
这会产生一个错误,因为它假定
递减
参数只是另一个排序项。

这样做:

dd <- data.frame(b = factor(c("Hi", "Med", "Hi", "Low"), 
      levels = c("Low", "Med", "Hi"), ordered = TRUE),
      x = c("A", "D", "A", "C"), y = c(8, 3, 9, 9),
      z = c(1, 1, 1, 2))
sort_list <- c("z","b")
dd[order(-dd[,sort_list[1]], dd[,sort_list[2]]), ]
# or
dd[order(-dd[,sort_list["z"]], dd[,sort_list["b"]]), ]

dd使用
data.table
order函数,您可以执行以下操作:

dd2:medd31
#>3:嗨,A 8 1
#>4:嗨,A 9 1

dplyr
示例

library(dplyr)
sort_list <- c("z","b")
sort_order=c(TRUE,FALSE)
dd %>% arrange_(.dots=ifelse(sort_order,paste0("desc(",sort_list,")"),sort_list))
库(dplyr)
排序列表%arrange(点=ifelse(排序顺序,粘贴0(“desc(“,排序列表”),排序列表))

您在找这个吗<代码>要求(dplyr);dd%>%group_by(b,z)%>%arrange(b,desc(z))
不,对不起。正如我所说,我的列名存储在一个变量中,所以我事先不知道它们。如果按3列排序呢?或者其他顺序(asc\desc)?正如@Batanichek所说,该解决方案仅限于一种非常特殊的情况(两列先减少,后增加)。有一个更普遍的解决办法会很有趣。但它解决了我的特殊问题。谢谢
dd <- data.frame(b = factor(c("Hi", "Med", "Hi", "Low"), 
      levels = c("Low", "Med", "Hi"), ordered = TRUE),
      x = c("A", "D", "A", "C"), y = c(8, 3, 9, 9),
      z = c(1, 1, 1, 2))
sort_list <- c("z","b")
dd[order(-dd[,sort_list[1]], dd[,sort_list[2]]), ]
# or
dd[order(-dd[,sort_list["z"]], dd[,sort_list["b"]]), ]
downup <- function(dat, sort_list){
    dat[order(-dat[,sort_list[1]], dat[,sort_list[2]]), ]
}
downup(dd)
library(dplyr)
sort_list <- c("z","b")
sort_order=c(TRUE,FALSE)
dd %>% arrange_(.dots=ifelse(sort_order,paste0("desc(",sort_list,")"),sort_list))