坚持我认为这是一个非常简单的解决方案,但是以某种方式我找不到办法。
我正在尝试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)))
答案 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