r语言 - 在分组数据帧中使用case_when时出错(因为它计算所有条件)



我有一个数据帧:

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代替==应该可以解决这个问题,因为:

  1. match精确返回1个匹配项(第一个),==可以返回多个匹配项(如果存在)
  2. 当没有匹配时返回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

相关内容

  • 没有找到相关文章

最新更新