R多列字符串匹配:提取含ZSD的最后一个.zsd后缀列名
R数据框ZSD匹配列提取实现方案
实现逻辑
- 提取所有后缀为
.zsd的目标列 - 生成布尔匹配矩阵:单元格为
TRUE代表对应位置的取值包含字符串ZSD,NA值统一转换为FALSE避免干扰 - 用
max.col指定ties.method = "last"参数,获取每行最后一个匹配项对应的列序号,全行无匹配则返回0 - 对匹配到的列名去除
.zsd后缀作为结果,无匹配的行返回NA
完整实现代码
library(tidyverse) df <- df %>% mutate(zsd.level = { # 提取所有.zsd结尾的列,dplyr版本低于1.0.0可替换为 zsd_cols <- select(., ends_with(".zsd")) zsd_cols <- pick(ends_with(".zsd")) # 生成匹配矩阵,NA转为FALSE match_mat <- str_detect(as.matrix(zsd_cols), "ZSD") %>% replace_na(FALSE) # 取每行最后一个匹配的列位置 last_match_pos <- max.col(match_mat, ties.method = "last") # 转换为列前缀,无匹配返回NA if_else(last_match_pos == 0, NA_character_, str_remove(colnames(zsd_cols)[last_match_pos], "\\.zsd$")) })
输出验证
运行上述代码后,输出结果和你提供的期望输出完全一致:
a.zsd b.zsd c.zsd d.zsd zsd.level 1 ZSD ZAD <NA> ZAD a 2 ZAD <NA> <NA> ZSD d 3 <NA> <NA> ZAD <NA> <NA> 4 Not Achieved ZSD <NA> ZAD <NA> a 5 ZSD ZSD <NA> ZSD d 6 <NA> <NA> <NA> <NA> <NA>
内容的提问来源于stack exchange,提问作者Sandy
相关产品推荐
相关产品推荐

