如何在dplyr中为分组内所有行填充二分类结果?
分组批量赋值新变量的解决方案
问题描述
需要通过group_by()创建新变量var3,规则是:若分组(group+d_num)内任意一行满足var1 == 1或var2 == 1,则该组所有行的var3都赋值为1;若组内无任何行满足条件,则赋值为0。原代码仅为满足条件的单行赋值1,无法实现整组统一赋值。
解决方法
核心是在分组后,用any()函数判断组内是否存在符合条件的行——any()会检查组内所有行,只要有一行满足条件就返回TRUE,否则返回FALSE,再用as.integer()将布尔值转为1/0,即可实现整组统一赋值。
修改后的代码如下:
library(tidyverse) set.seed(10) dat <- data.frame( group = rep(c("Group1", "Group2"), each = 18), d_num = rep(c(1:6), times = 2, each = 3), var1 = sample(1:4, 36, replace = TRUE), var2 = sample(1:4, 36, replace = TRUE) ) x <- dat %>% group_by(group, d_num) %>% mutate(var3 = as.integer(any(var1 == 1 | var2 == 1))) %>% ungroup() # 可选:如果后续不需要分组状态,可以取消分组
代码说明
any(var1 == 1 | var2 == 1):遍历当前分组的所有行,只要有一行满足var1或var2等于1,就返回TRUE,否则FALSE。as.integer():把布尔值TRUE转为1,FALSE转为0,这样整个分组的所有行都会得到同一个var3值。- 可选的
ungroup():如果后续操作不需要保留分组结构,取消分组可以避免意外问题。
内容的提问来源于stack exchange,提问作者user13973103
相关产品推荐
相关产品推荐

