如何基于文本字符串中的数值为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合并成字符串。
运行后得到的结果与预期一致:
| speech | overlaps | target |
|---|---|---|
| N_28.5 | Body_N_20; Hands_CH1_5 | Body_N |
| CH1_20 | Body_CH1_10; Hands_CH2_3 | Body_CH1 |
| CH2_33.4 | Body_CH2_44; Hands_N_30; Hands_N_3 | Body_CH2; Hands_N |
内容的提问来源于stack exchange,提问作者Wangana
相关产品推荐
相关产品推荐

