使用dplyr按目标术语列表grep匹配后分组汇总value列均值
解决代码
首先加载依赖、定义数据和目标术语:
library(dplyr) # 原始数据 df <- data.frame(ID = c("A", "B", "C", "D"), term = c("cat,dog,snake", "cat,eel", "fish,eel", "fish,dog"), value = c(10, 50, 3, 6)) # 目标查询术语向量 target_terms <- c("dog", "fish", "eel")
核心计算逻辑(无需拆分原数据行):
# 遍历每个目标术语,匹配对应行计算均值后整理成数据框 result <- sapply(target_terms, function(x) { # 加\\b单词边界避免子串误匹配,不需要可删除 mean(df$value[grepl(paste0("\\b", x, "\\b"), df$term)]) }) %>% enframe(name = "term", value = "mean")
输出结果
> print(result) # A tibble: 3 × 2 term mean <chr> <dbl> 1 dog 8 2 fish 4.5 3 eel 26.5
原代码问题说明
你之前的写法错误原因是grepl不支持直接传入术语列表作为匹配模式,它的向量化逻辑是逐位置对应匹配,无法实现每个术语单独匹配所有行的需求。
本方案仅遍历你要查询的目标术语列表,遍历次数等于目标术语的数量,不会对原数据的行做扩容,完全适配term字段包含大量选项的场景,执行效率远高于拆分term的方案。
内容的提问来源于stack exchange,提问作者R-MASHup
相关产品推荐
相关产品推荐

