基于Index列重编码R语言DataFrame,求更简洁实现方案
简洁解决方案
这里提供两种更简洁的实现方式,均能在1-2行内完成需求:
方案1:Tidyverse 风格(核心代码1行)
先加载工具包,再执行转换:
library(tidyverse) df %>% mutate(across(col_a:col_d, ~ifelse(str_detect(Index, str_extract(cur_column(), "\\d")), "Yes", "No")))
逻辑说明:
across(col_a:col_d)遍历所有需要转换的列str_extract(cur_column(), "\\d")从列名中提取对应规则数字(比如col_a提取1,col_b提取2)str_detect(Index, ...)检查当前行的Index是否包含该数字,匹配则返回"Yes",否则返回"No"
方案2:Base R 原生实现(1行代码)
无需额外加载包,直接用原生函数完成:
df[-1] <- t(sapply(strsplit(df$Index, ", "), \(x) replace(rep("No", 4), as.integer(x), "Yes")))
逻辑说明:
strsplit(df$Index, ", ")将每行的Index分割为数字字符向量replace(rep("No",4), as.integer(x), "Yes")生成初始全为"No"的向量,将Index对应的位置替换为"Yes"sapply逐行处理后转置(t()),赋值给原数据框除Index外的所有列
验证输出
两种方法均能生成你期望的结果:
Index col_a col_b col_c col_d 1 4 No No No Yes 2 1 Yes No No No 3 1, 3 Yes No Yes No 4 2 No Yes No No 5 2, 3 No Yes Yes No 6 2 No Yes No No 7 3, 4 No No Yes Yes 8 4 No No No Yes 9 1 Yes No No No
内容的提问来源于stack exchange,提问作者benson23
相关产品推荐
相关产品推荐

