R语言如何基于多个_atc结尾的列生成新标记列med_use?
需求说明
现有数据集结构示例如下:
med_1_atc med_2_atc med_3_atc N06AX07 N06AX07 N06AX07 N06AX07 N06AX09 N06AX07 N06AG07 N06AD07 M06AX07 D06FX07 L06TX07 N06AX07 N06AX07
需要生成新变量med_use:只要任意一个以_atc结尾的列中的编码以N06A开头,med_use就标记为1,其余情况留空,预期输出如下:
med_1_atc med_2_atc med_3_atc med_use N06AX07 N06AX07 N06AX07 1 N06AX07 1 N06AX09 N06AX07 N02BE07 1 N06AD07 1 M06AX07 D06FX07 L06TX07 N06AX07 1
原有运行错误的代码如下:
df <- mutate (df, med_use = case_when( ends_with("_atc", "N06A") ~ 1 TRUE ~ NA_real_ ))
错误原因
ends_with()是dplyr的列选择辅助函数,仅用于筛选符合命名规则的列,不能直接用来判断单元格的内容是否符合规则,原有代码混淆了列选择和单元格值匹配的逻辑。
正确实现
推荐使用dplyr 1.0.0及以上版本内置的if_any()函数实现,代码简洁性能更高:
library(dplyr) df <- df %>% mutate(med_use = case_when( # 逐行判断:所有_atc结尾的列中,任意一列内容以N06A开头则返回TRUE if_any(ends_with("_atc"), ~ grepl("^N06A", .x)) ~ 1, TRUE ~ NA_real_ ))
如果使用的dplyr版本较低不支持if_any(),可以用行分组的方式实现:
library(dplyr) df <- df %>% rowwise() %>% # 按行分组处理 mutate(med_use = case_when( # 把当前行所有_atc结尾的列的值合并后判断是否有符合规则的内容 any(grepl("^N06A", c_across(ends_with("_atc")))) ~ 1, TRUE ~ NA_real_ )) %>% ungroup() # 取消行分组,避免影响后续数据操作
内容的提问来源于stack exchange,提问作者R_beginner
相关产品推荐
相关产品推荐

