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

如何基于文本字符串中的数值为R数据框新增目标列?

解决方案

我们可以通过字符串拆分+正则提取+逐行逻辑判断实现需求,以下是完整的R代码:

# 原始数据
speech <- c("N_28.5", "CH1_20", "CH2_33.4")
overlaps <- c("Body_N_20; Hands_CH1_5", "Body_CH1_10; Hands_CH2_3", "Body_CH2_44; Hands_N_30; Hands_N_3")
df <- data.frame(speech, overlaps, stringsAsFactors = FALSE)

# 定义处理函数
process_target <- function(speech_val, overlaps_val) {
  # 提取speech中的数值并计算一半阈值
  speech_num <- as.numeric(sub(".*_", "", speech_val))
  threshold <- speech_num / 2
  
  # 拆分overlaps为单个条目
  overlap_items <- strsplit(overlaps_val, "; ")[[1]]
  
  # 遍历每个条目,判断并提取符合条件的文本
  valid_items <- sapply(overlap_items, function(item) {
    # 提取条目里的数值
    item_num <- as.numeric(sub(".*_", "", item))
    # 提取前缀文本(去掉最后一个下划线和数值)
    item_text <- sub("_\\d+\\.*\\d*$", "", item)
    # 判断是否符合条件,符合则返回文本,否则返回空
    if (item_num >= threshold) item_text else NULL
  })
  
  # 去重并合并成字符串
  paste(unique(valid_items), collapse = "; ")
}

# 应用函数生成target列
df$target <- mapply(process_target, df$speech, df$overlaps)

# 查看结果
df

代码关键部分解释:

  • 提取speech数值:用sub(".*_", "", speech_val)匹配最后一个下划线后的内容,转成数值后计算一半作为阈值。
  • 拆分overlaps:用strsplit按; 拆分每个overlaps条目,得到单个元素列表。
  • 遍历判断每个条目:
    • 同样用正则sub(".*_", "", item)提取每个条目的数值;
    • 用sub("_\\d+\\.*\\d*$", "", item)去掉最后一个下划线及后面的数字(包括小数),得到前缀文本;
    • 比较数值和阈值,符合条件则保留前缀。
  • 去重合并:用unique去重(比如第三行的两个Hands_N),再用paste合并成字符串。

运行后得到的结果与预期一致:

speechoverlapstarget
N_28.5Body_N_20; Hands_CH1_5Body_N
CH1_20Body_CH1_10; Hands_CH2_3Body_CH1
CH2_33.4Body_CH2_44; Hands_N_30; Hands_N_3Body_CH2; Hands_N

内容的提问来源于stack exchange,提问作者Wangana

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 11:02:47