【问题标题】:r - arrange values in a dataframe, within a group, based on a variable, in ascending or descending orderr - 在数据框中,在组内,基于变量,按升序或降序排列值
【发布时间】:2018-11-02 22:24:50
【问题描述】:

陷入了我认为非常简单的解决方案,但不知何故我找不到方法。

我正在尝试 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)))

【问题讨论】:

  • 尝试使用'test1 %>% group_by(var1) %>%arrange(desc(var2))'进行降序

标签: r group-by dplyr


【解决方案1】:

我认为这可以满足您的需求。如果您需要处理更多var3 的场景,您也可以将其他情况添加到case_when 语句中。此外,对于默认排序,您可以为最后一种情况添加 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  

【讨论】:

  • 完美答案。有空时会接受。非常感谢
猜你喜欢
  • 2023-02-02
  • 2018-05-23
  • 1970-01-01
  • 2020-08-29
  • 2021-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多