r-根据变量以升序或降序排列数据帧中组中的值

时间:2018-11-02 22:24:51

标签: r group-by dplyr

坚持我认为这是一个非常简单的解决方案,但是以某种方式我找不到办法。

我正在尝试dplyr::arrange中的dataframe值。问题是我想使用dplyr::group_by将函数应用于组,并根据内部变量确定函数是升序还是降序。

一个简单的例子:

library(dplyr)

test <- 
    data.frame(
        var1 = c(rep(1,5), rep(2,5)),
        var2 = c(1,3,2,5,9,7,8,3,5,9),
        var3 = c(rep("i", 5), rep("d", 5))
    )

在这里,我尝试按分组变量var1进行排列,但是所有内容都按升序排列:

test %>% 
    group_by(var1) %>% 
    arrange(var2, .by_group = T)

目标是根据var3值自动进行排列。更具体地说,如果var3为“ i”,则升序;如果为“ d”,则降序,但在组内。

所需结果:

data.frame(
    var1 = c(rep(1,5), rep(2,5)),
    var2 = c(1,2,3,5,9,9,8,7,5,3),
    var3 = c(rep("i", 5), rep("d", 5)))

1 个答案:

答案 0 :(得分:3)

我认为这可以满足您的需求。如果需要解决case_when的更多情况,也可以将其他情况添加到var3语句中。另外,对于默认排序,您可以为最后一种情况添加类似TRUE ~ var2的内容,以处理var3中的未知值。

test %>% 
  group_by(var1) %>% 
  arrange(case_when(var3 == "i" ~ var2,
                    var3 == "d" ~ -var2), .by_group = T)

# A tibble: 10 x 3
# Groups:   var1 [2]
    var1  var2 var3 
   <dbl> <dbl> <fct>
 1     1     1 i    
 2     1     2 i    
 3     1     3 i    
 4     1     5 i    
 5     1     9 i    
 6     2     9 d    
 7     2     8 d    
 8     2     7 d    
 9     2     5 d    
10     2     3 d