如何判断指定值是否存在于DataFrame特定前缀开头的列中
R 逐行匹配i10_前缀列目标值实现方法
需求说明
你的DataFrame包含100列以上i10_前缀的列,以及其他无关数据列,需要新增逻辑变量:逐行检查所有i10_开头的列,只要行内存在C7931、C7932两个值中的任意一个就返回TRUE,不存在则返回FALSE,最终结果匹配向量c(TRUE, TRUE, FALSE, FALSE, FALSE, TRUE)。
实现代码
dplyr 写法(代码简洁,适合日常数据处理)
常规写法易读性强:
library(dplyr) df <- df %>% rowwise() %>% # 自动选中所有i10_开头的列做逐行判断 mutate(has_target_val = any(c_across(starts_with("i10_")) %in% c("C7931", "C7932"))) %>% ungroup()
如果数据集行数较大(10万行以上),推荐用向量化运算的高性能写法,运行速度快数倍:
df <- df %>% mutate(has_target_val = if_any(starts_with("i10_"), ~ .x %in% c("C7931", "C7932")))
提取最终判断向量:
res <- df$has_target_val
代码逻辑说明:
starts_with("i10_")是dplyr提供的列选择助手,会自动匹配所有列名以i10_开头的字段,无需手动枚举上百个列名rowwise()按行分组执行后续计算,避免整列计算的逻辑错误c_across()提取当前行所有选中列的值,%in%判断值是否属于两个目标值范畴any()/if_any()只要当前行有一个值匹配就返回TRUE,所有值都不匹配返回FALSE
base R 写法(无需安装加载第三方包)
# 正则匹配取出所有i10_开头的列名 target_cols <- grep("^i10_", colnames(df), value = TRUE) # 逐行应用判断逻辑 df$has_target_val <- apply(df[, target_cols], 1, function(x) any(x %in% c("C7931", "C7932"))) # 提取最终判断向量 res <- df$has_target_val
结果校验
上述代码在示例数据上运行后,得到的res向量输出为c(TRUE, TRUE, FALSE, FALSE, FALSE, TRUE),和预期结果完全一致。
内容的提问来源于stack exchange,提问作者ltong
相关产品推荐
相关产品推荐

