如何基于id分组,利用dplyr根据var1中是否存在b创建新变量var2?
解决dplyr分组后创建统一组内变量的问题
我来帮你搞定这个问题~你之前的写法没得到预期结果,核心原因是:你用if_else(var1 %in% 'b', 'foo','bar')是逐行判断每一行的var1值,所以同一个id分组里,既有var1为'a'的行,也有var1为'b'的行时,var2会出现混合的'foo'和'bar',但我们需要的是整个分组统一的var2值。
正确的实现思路
我们需要先对每个分组做组级判断:检查当前id的分组里是否存在任意一个var1等于'b',然后用这个判断结果给整个分组的所有行统一赋值var2。
方法1:用any()结合if_else
这是最直接的写法,用any(var1 == 'b')来判断组内是否有'b',再通过mutate给整组赋值:
library(dplyr) # 原始数据 df.ex <- tibble(id = c(rep(1, 4), rep(2, 4), rep(3, 4)), var1 = c('a','a','b','b','a','a','a','a','b','b','b','b')) # 生成目标结果 df.ex.outcome <- df.ex %>% group_by(id) %>% # 组内只要有一个'b',整组var2就是'foo',否则是'bar' mutate(var2 = if_else(any(var1 == 'b'), 'foo', 'bar')) %>% ungroup() # 可选:取消分组状态,方便后续操作
方法2:用case_when实现
如果你习惯用case_when做多条件判断,写法类似:
df.ex.outcome <- df.ex %>% group_by(id) %>% mutate(var2 = case_when( any(var1 == 'b') ~ 'foo', TRUE ~ 'bar' # 其他情况(组内没有'b')赋值'bar' )) %>% ungroup()
验证结果
运行上述代码后,你可以打印df.ex.outcome,得到的结果就和你期望的完全一致了:
# 输出结果 # # A tibble: 12 × 3 # id var1 var2 # <dbl> <chr> <chr> # 1 1 a foo # 2 1 a foo # 3 1 b foo # 4 1 b foo # 5 2 a bar # 6 2 a bar # 7 2 a bar # 8 2 a bar # 9 3 b foo #10 3 b foo #11 3 b foo #12 3 b foo
内容的提问来源于stack exchange,提问作者pd441
相关产品推荐
相关产品推荐

