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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 13:15:03