如何使用dplyr按组根据另一列值为新列填充对应值?
用dplyr实现分组赋值需求
Hey there, let's tackle this problem with dplyr—it's straightforward once you break down the grouping logic! Here's how you can generate the z1 column exactly as you need:
核心代码
library(dplyr) # 你的原始数据 a <- data.frame(x=c('A','A','A','B','B','B'), y=c('Yes','No','No','Yes','No','No'), z=c(1,2,3,4,5,6)) # 生成z1列 a1 <- a %>% group_by(x) %>% mutate(z1 = z[y == 'Yes']) %>% ungroup() # 查看结果 print(a1)
代码逻辑解释
group_by(x): 先按x列把数据分成两组(A组和B组),所有后续操作都会在每组内独立执行。mutate(z1 = z[y == 'Yes']): 在每个分组里,我们筛选出y == 'Yes'对应的z值。因为你的每组里只有一个"Yes"条目,这个值会被自动"广播"到组内的所有行——所以Yes行保留自己的z值,No行直接复用组内Yes行的z值。ungroup(): 完成分组操作后解除分组,让数据回到普通的数据框格式(可选,但推荐保持数据整洁)。
更稳健的版本(应对多Yes场景)
如果你的数据里某组可能存在多个"Yes"条目,你可以用first()或last()指定取第一个/最后一个Yes对应的z值,避免因返回多个值导致报错:
a1 <- a %>% group_by(x) %>% mutate(z1 = first(z[y == 'Yes'])) %>% ungroup()
运行结果
执行代码后,你会得到完全符合预期的输出:
# A tibble: 6 × 4 x y z z1 <chr> <chr> <dbl> <dbl> 1 A Yes 1 1 2 A No 2 1 3 A No 3 1 4 B Yes 4 4 5 B No 5 4 6 B No 6 4
内容的提问来源于stack exchange,提问作者Feng Chen
相关产品推荐
相关产品推荐

