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

在R语言中统计一列字符串在另一列中的非精确匹配出现次数

统计每个ID在pedi列中的出现次数

原始数据

df <- data.frame(id = c("p3", "p5", "p8", "p9", "p10", "p11"), 
                 pedi = c("p1/p2", "p3/p4", "p3/p5", "(p3/p4)/p5", "p5/p8", "p4/p10"))

你的代码问题

你写的循环存在两个关键错误:

  • 循环范围错误:for (i in length(id))只会遍历到id的长度值(这里是6),不会逐个遍历每个ID元素
  • 赋值逻辑错误:每次循环都直接覆盖整个id_in_pedi列,而不是给对应行的位置赋值
id <- df$id 
for (i in length(id)) {
  df$id_in_pedi <- sum(grepl(i, df$pedi))
}

修正方案

方案1:修正循环逻辑

先初始化结果列,再逐个遍历ID并统计次数:

df$id_in_pedi <- 0
for (i in seq_along(df$id)) {
  target_id <- df$id[i]
  df$id_in_pedi[i] <- sum(grepl(target_id, df$pedi))
}

方案2:向量化操作(更符合R的风格,效率更高)

用sapply直接对每个ID执行统计:

df$id_in_pedi <- sapply(df$id, function(x) sum(grepl(x, df$pedi)))

方案3:精准匹配(避免误匹配)

如果担心出现类似p3匹配到p30的情况,可以添加单词边界确保完全匹配:

df$id_in_pedi <- sapply(df$id, function(x) sum(grepl(paste0("\\b", x, "\\b"), df$pedi)))

最终结果

运行后得到你期望的输出:

df
#>    id         pedi id_in_pedi
#> 1  p3       p1/p2          3
#> 2  p5       p3/p4          3
#> 3  p8       p3/p5          1
#> 4  p9 (p3/p4)/p5          0
#> 5 p10       p5/p8          1
#> 6 p11      p4/p10          0

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 23:40:48