在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
相关产品推荐
相关产品推荐

