在R中使用tidyverse比较数据框变量对并生成标记变量
批量生成变量匹配标记的tidyverse实现
针对你的需求——批量比较var与sum_var变量对,生成var_flag标记变量(1表示值匹配,0表示不匹配),可以用以下tidyverse代码高效实现:
library(tidyverse) # 先运行你提供的示例数据生成代码 local_iris <- iris %>% mutate( across(all_of(starts_with("Sepal")), ~ sum(.x, na.rm = TRUE), .names = "sum_{.col}"), across(all_of(starts_with("Petal")), ~ .x + 0, .names = "sum_{.col}") ) # 核心:批量生成匹配标记 local_iris_with_flags <- local_iris %>% mutate( # 遍历所有非sum_开头的原始变量 across(!starts_with("sum_"), # 比较当前变量与对应的sum_变量,转成1/0标记 ~ as.integer(.x == get(str_c("sum_", cur_column()))), # 自动命名为{原始变量名}_flag .names = "{.col}_flag") )
代码逻辑拆解
- 自动匹配变量对:通过
!starts_with("sum_")定位所有原始变量,再用str_c("sum_", cur_column())拼接出对应的sum_var变量名,无需手动指定每一对。 - 标记生成规则:
as.integer()把TRUE/FALSE的比较结果转为1/0,刚好满足「匹配为1,不匹配为0」的要求。 - 批量命名:
.names参数自动沿用原始变量名,加上_flag后缀,完全符合你要的命名规则。
验证结果
运行下面的代码可以快速查看标记是否符合预期(Petal类变量的标记全为1,Sepal类全为0):
local_iris_with_flags %>% select(contains("Petal"), contains("Sepal_flag")) %>% head()
内容的提问来源于stack exchange,提问作者microbe
相关产品推荐
相关产品推荐

