R统计数据框中标签多形式出现次数的警告与计数错误问题
问题解答
问题原因说明
- 警告含义:
argument is not an atomic vector; coercing警告是因为stri_count_*和str_count系列函数的首个入参要求为字符串原子向量,你直接传入了data.frame类型的tdf,函数隐式将数据框转换为了向量。如果你的需求是统计全表所有单元格的内容,该转换本身不影响计算逻辑,但建议显式转换避免警告。 - NG前缀统计重复:原有代码存在两个问题,一是混淆了
stri_count_fixed(固定字符串匹配)和正则匹配的用法,二是没有给NG-标签加左边界限制,导致ReviewNG-AI字符串末尾的NG-AI也被匹配到,最终统计值是真实NG前缀数量与ReviewNG前缀数量的总和。 - 纯标签统计偏差:原有代码一是匹配逻辑没有排除带前缀的场景,二是混合使用fixed匹配和regex对象导致匹配行为不符合预期,最终少统计了1条符合要求的记录。
修正后实现代码
基于stringr实现的准确统计方案如下:
library(tidyverse) # 提前将全表内容转为原子向量,避免隐式转换警告 all_content <- unlist(tdf, use.names = FALSE) # 封装标签统计函数,输入标签名返回四个维度的统计结果 count_tag <- function(target_tag) { # 1. 标签总出现次数 total_cnt <- sum(str_count(all_content, paste0("(?<=-|\\|)", target_tag, "(?=\\||$)"))) # 2. 带ReviewNG-前缀的匹配次数 rng_cnt <- sum(str_count(all_content, paste0("(?<=\\|)ReviewNG-", target_tag, "(?=\\||$)"))) # 3. 带NG-前缀的匹配次数 ng_cnt <- sum(str_count(all_content, paste0("(?<=\\|)NG-", target_tag, "(?=\\||$)"))) # 4. 纯标签匹配次数 pure_cnt <- sum(str_count(all_content, paste0("(?<=\\|)(?<!-)", target_tag, "(?=\\||$)"))) return(tibble( tag = target_tag, total = total_cnt, review_ng_prefix = rng_cnt, ng_prefix = ng_cnt, pure_tag = pure_cnt )) } # 测试AI标签统计 count_tag("AI")
运行结果
对AI标签统计的输出如下,和手动统计结果完全一致:
| tag | total | review_ng_prefix | ng_prefix | pure_tag |
|---|---|---|---|---|
| AI | 30 | 7 | 7 | 16 |
补充说明
原有直接使用str_count(tdf, pt)结果偏差的原因是:str_count对data.frame的默认处理逻辑不符合全表统计的预期,显式通过unlist将全表转为字符串向量后即可解决该问题。
内容的提问来源于stack exchange,提问作者TeoK
相关产品推荐
相关产品推荐

