我有一个数据帧:
df <- data.frame(group = c(1, 1, 1, 2, 2, 2),
var = c(1, 2, 3, 2, 3, 4),
value = c(1, 2, 3, 4, 5, 6),
ranking = c(1, 2, 3, 1, 2, 3))
group var value ranking
1 1 1 1 1
2 1 2 2 2
3 1 3 3 3
4 2 2 4 1
5 2 3 5 2
6 2 4 6 3
我想做什么:
按var
分组,然后取组1的秩(如果该组中存在group == 1
的行),否则取已有的秩或(当组为2时)在秩上加一定的数。所以这是一种"连接"通过将只存在于一组(特别是第二组)的秩加到末尾来获得秩。
下面是我的代码:
df |>
group_by(var) |>
mutate(ranking = case_when(n() == 2 ~ ranking[group == 1],
group == 1 ~ ranking,
group == 2 ~ ranking + 3))
给出错误:
Error in `mutate()`:
ℹ In argument: `ranking = case_when(...)`.
ℹ In group 4: `var = 4`.
Caused by error:
! `ranking` must be size 1, not 0.
问题是,当评估每一行的ranking[group == 1]
时,不管某些分组没有group == 1
这一事实。我以前遇到过这个问题,但不记得当时我们是怎么解决的了。
预期输出:
group var value ranking
1 1 1 1 1
2 1 2 2 2
3 1 3 3 3
4 2 2 4 2
5 2 3 5 3
6 2 4 6 6
使用match
代替==
应该可以解决这个问题,因为:
match
精确返回1个匹配项(第一个),==
可以返回多个匹配项(如果存在)- 当没有匹配时返回
NA
而不是numeric(0)
。
library(dplyr)
df |>
group_by(var) |>
mutate(ranking = case_when(n() == 2 ~ ranking[match(1, group)],
group == 1 ~ ranking,
group == 2 ~ranking + 3))
# group var value ranking
# <dbl> <dbl> <dbl> <dbl>
#1 1 1 1 1
#2 1 2 2 2
#3 1 3 3 3
#4 2 2 4 2
#5 2 3 5 3
#6 2 4 6 6