You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 17:54:00