使用dplyr将多列不同字符串替换为1并新增计数列的实现方法
dplyr 实现需求的具体方案
以下代码基于dplyr 1.0.0及以上版本,可直接运行测试:
前置准备
先加载依赖包、构造示例数据:
# 加载包 library(dplyr) # 构造示例测试数据 df <- tibble( id = c("01", "02", "03"), Disease1 = c("disease1", NA, "disease1"), Disease2 = c(NA, "disease2", "disease2"), Disease3 = c("disease3", NA, NA) )
方案1:用starts_with()匹配列
适合列名有统一前缀的场景:
df_result <- df %>% # 第一步:匹配所有以Disease开头的列,非NA值替换为1,NA保留 mutate(across(starts_with("Disease"), ~ifelse(!is.na(.), 1, NA))) %>% # 第二步:统计匹配列中1的总数,na.rm=TRUE跳过NA值避免结果为NA mutate(Total_diseases = rowSums(across(starts_with("Disease")), na.rm = TRUE))
方案2:按列索引范围匹配
适合需要指定固定列范围的场景,比如你需要的22到65列直接修改括号内的数字即可:
df_result <- df %>% # 示例匹配第2到第4列,对应你的需求可替换为22:65 mutate(across(2:4, ~ifelse(!is.na(.), 1, NA))) %>% mutate(Total_diseases = rowSums(across(2:4), na.rm = TRUE))
低版本dplyr兼容写法
如果你的dplyr版本低于1.0.0,把across替换为mutate_at即可:
# 以starts_with匹配为例 df_result <- df %>% mutate_at(vars(starts_with("Disease")), ~ifelse(!is.na(.), 1, NA)) %>% mutate(Total_diseases = rowSums(select(., starts_with("Disease")), na.rm = TRUE))
内容的提问来源于stack exchange,提问作者Anakin Skywalker
相关产品推荐
相关产品推荐

