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

如何判断指定值是否存在于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 11:57:20