如何通过多变量OR条件快速生成性别暴力受害标识新变量
最优实现方案(dplyr 1.0.0及以上版本)
直接使用dplyr内置的if_any()函数,可批量匹配指定范围内的变量,逐行判断是否存在至少一个变量满足取值为1的条件:
不同变量选择场景的写法:
- 如果所有暴力指标变量都是以固定前缀命名(比如均为
v开头,对应v1到v70):
library(dplyr) base <- base %>% mutate(`some point in life` = as.integer(if_any(starts_with("v"), ~.x == 1)))
- 如果暴力指标是连续的列范围(比如从第2列到第71列,或者变量名从v1连续到v70):
base <- base %>% mutate(`some point in life` = as.integer(if_any(v1:v70, ~.x == 1)))
- 如果变量分为两类命名规则(比如过去12个月的指标前缀为
past_,12个月之前的前缀为before_):
base <- base %>% mutate(`some point in life` = as.integer(if_any(c(starts_with("past_"), starts_with("before_")), ~.x == 1)))
if_any会返回逻辑值TRUE/FALSE,转成integer后正好对应1/0,完全符合你的判定规则,不需要手动罗列70个变量。如果指标存在缺失值,可在判断条件中加na.rm = TRUE避免结果返回NA:
mutate(`some point in life` = as.integer(if_any(v1:v70, ~.x == 1, na.rm = TRUE)))
旧版本dplyr兼容方案
如果你的dplyr版本低于1.0.0没有if_any函数,可以用rowwise() + c_across()实现:
base <- base %>% rowwise() %>% mutate(`some point in life` = as.integer(any(c_across(v1:v70) == 1, na.rm = TRUE))) %>% ungroup()
该方案为逐行运算,数据量较大时性能低于if_any方案,优先推荐前者。
内容的提问来源于stack exchange,提问作者BENJAMIN CERPA
相关产品推荐
相关产品推荐

