R语言中如何统计DataFrame内指定单词的所有出现次数
批量统计DataFrame中包含目标词的单元格数量
问题本质
你目前用的sum(DF == "Touch")是精确全值匹配,只有单元格内容和目标字符串100%一致时才会被纳入计数,只要单元格里还有其他内容(比如带逗号的多选项、前后空格)就会匹配失败。要实现“不管单元格有没有其他内容,只要包含目标词就算一次”的统计,只需要换成字符串包含匹配的逻辑即可,不需要复杂的语法调整。
方法1:基础R原生快速实现(无需安装额外包)
基础R提供的grepl()函数可以直接做包含匹配:只要单元格内容里存在目标字符串,就返回TRUE,否则返回FALSE,刚好可以通过sum计数。
比如统计所有包含"Touch"的单元格,直接把原来的精确匹配代码替换成:
sum(grepl("Touch", DF, fixed = TRUE))
参数说明:
fixed = TRUE:将目标词作为普通文本匹配,不触发正则解析,避免Other (describe)这类带括号特殊符号的目标词出现匹配错误。- 函数会自动遍历DataFrame的每一个单元格,只要内容里存在目标词,无论前后有没有其他分隔符、其他选项,都会返回
TRUE,sum计算时就会把这些单元格全部纳入计数。
如果要一次性统计所有9个目标词的出现次数,可以用sapply批量遍历计算,不需要逐行写代码:
# 录入所有需要统计的目标词 target_words <- c("Pain", "Tingling", "Touch", "Scratching", "Other (describe)", "Pressure", "Ticklish", "Warm", "Cold") # 逐个计算每个词的命中次数 word_stat <- sapply(target_words, function(current_word) { sum(grepl(current_word, DF, fixed = TRUE)) }) # 直接输出结果,每个目标词对应的计数会一一对应展示 word_stat
方法2:更严谨的拆分匹配(避免子串误判)
从你给出的样例来看,带多个选项的单元格都是用逗号分隔的格式,如果你担心出现子串误匹配(比如匹配"Touch"的时候,不小心把"TouchPain"这类拼写错误的内容也算进来),可以先把每个单元格按逗号拆成单个独立选项,再做匹配,逻辑会更可靠:
# 步骤1:把所有单元格内容按逗号拆分,去掉每个选项前后的多余空格 split_options <- strsplit(as.character(DF), split = ",", fixed = TRUE) |> unlist() |> # 把拆分后的所有选项拼成一个长向量 trimws() # 清除" Touch "这类带前后空格的选项的多余字符 # 步骤2:按预设的目标词顺序统计次数 word_stat <- table(factor(split_options, levels = target_words))
这种方法哪怕遇到单元格里写"Pressure,Tingling"这种不带空格的分隔格式,也不会出现匹配错误。
小提醒:如果你的数据里存在大小写不一致的情况(比如单元格里写了小写的"touch"),可以在
grepl函数参数里加ignore.case = TRUE,让匹配不区分大小写,避免漏算。
内容的提问来源于stack exchange,提问作者SophieMQ
相关产品推荐
相关产品推荐

