我觉得这是一个非常简单的解决方案,但不知怎么的,我找不到方法。
我正在尝试dataframe
中的dplyr::arrange
值。问题是,我想使用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)))
我认为这实现了您想要的。如果需要处理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