【问题标题】:Ordering data.frame by multiple variables in mixed direction [duplicate]通过混合方向的多个变量对data.frame进行排序[重复]
【发布时间】:2018-05-01 21:49:29
【问题描述】:

对于这个示例 data.frame,

df <- data.frame(var1=c("b","a","b","a","a","b"),
                 var2=c("l","l","k","k","l","k"),
                 var3=c("t","t","x","t","x","x"),
                 var4=c(5,3,3,5,5,3),
                 stringsAsFactors=F)

未分类

  var1 var2 var3 var4
1    b    l    t    5
2    a    l    t    3
3    b    k    x    3
4    a    k    t    5
5    a    l    x    5
6    b    k    x    3

我想同时按此顺序对“var2”、“var3”和“var4”三列进行排序。一列升序,另外两列降序。要排序的列名存储在变量中。

sort_asc <- "var2"
sort_desc <- c("var3","var4")

base R 中执行此操作的最佳方法是什么?

更新详情

如果先按“var2”升序排序(第 1 步)然后按“var3”和“var4”降序排序(如第 2 步),这是输出。

var1   var2 var3 var4
a      l    x    5
b      k    x    3
b      k    x    3
a      k    t    5
b      l    t    5
a      l    t    3

但我正在寻找的是同时做这三种排序来得到这个:

var1 var2 var3 var4
b    k    x    3
b    k    x    3
a    k    t    5
a    l    x    5
b    l    t    5
a    l    t    3

'var2'是升序(k,l),在k和l内,'var3'是降序,'var4'也是降序

澄清一下,这个问题与其他 data.frame 排序问题有何不同...

  • 多列排序
  • 要排序的列名存储在变量中
  • 不同的排序方向(asc、desc)
  • 排序不是逐步的(一个接一个的排序),而是同时的(同时所有选定的列)
  • 使用基础 R,而不是 dplyr

【问题讨论】:

标签: r


【解决方案1】:

逐步排序(先升序再降序)。

dplyr 解决方案:

library(dplyr)
df %>% 
   arrange_at(sort_asc) %>%
   arrange_at(sort_desc, desc)

  var1 var2 var3 var4
1    a    l    x    5
2    b    k    x    3
3    b    k    x    3
4    a    k    t    5
5    b    l    t    5
6    a    l    t    3

基础 R 解决方案:

对于base R,如果有多个列(通常)在do.call 中使用order。在这里,我们先创建升序索引,然后使用第二组列('sort_desc')进行降序排序

i1 <- do.call(order, df[sort_asc]) 
df1 <- df[i1,]
i2 <-  do.call(order, c(df1[sort_desc], list(decreasing = TRUE)))
df1[i2,]

  var1 var2 var3 var4
5    a    l    x    5
3    b    k    x    3
6    b    k    x    3
4    a    k    t    5
1    b    l    t    5
2    a    l    t    3

同时/顺序排序(所有排序变量都在一个排序步骤中使用):

dplyr 解决方案:

df %>% 
   arrange_(.dots  = c(sort_asc, paste0("desc(", sort_desc, ")")))

#   var1 var2 var3 var4
#1    b    k    x    3
#2    b    k    x    3
#3    a    k    t    5
#4    a    l    x    5
#5    b    l    t    5
#6    a    l    t    3

基础 R 解决方案:

对于base R,如果我们需要与arrange_类似的输出

df[do.call(order, c(as.list(df[sort_asc]), lapply(df[sort_desc], 
               function(x) -xtfrm(x)))),]

#  var1 var2 var3 var4
#3    b    k    x    3
#6    b    k    x    3
#4    a    k    t    5
#5    a    l    x    5
#1    b    l    t    5
#2    a    l    t    3

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-21
    • 2013-09-16
    • 2013-10-15
    • 1970-01-01
    • 2014-06-07
    • 2013-08-09
    相关资源
    最近更新 更多