如何统计R语言DataFrame指定列变量中多个指定字符的出现次数
问题原因
str_count函数的向量化匹配规则:当输入的string参数为长度n的向量、pattern参数为长度m的向量时,会自动循环匹配两个向量的元素,而不是对每个string分别匹配所有pattern。你的代码中word列长度为4,pattern长度为2,实际匹配逻辑为:第1个单词匹配"a"、第2个匹配"p"、第3个匹配"a"、第4个匹配"p",得到的计数结果为c(1, 0, 1, 3)。dplyr::mutate中直接调用sum()会对整列结果做全局聚合,返回长度为1的标量,因此所有行的num_ap都等于全局求和结果1+0+1+3=5。
解决方法
方法1:调整匹配规则(推荐)
将多个匹配字符合并为正则或的模式,长度为1的pattern会对每个单词分别统计所有匹配字符的总次数,无需额外求和:
library(tidyverse) dat <- tibble(id = 1:4, word = c("apple", "banana", "pear", "pineapple")) dat <- dat %>% mutate(num_ap = str_count(word, "a|p"))
方法2:逐行计算
如果需要保留多个pattern的写法,可以通过rowwise()指定逐行运算,sum仅对当前行的匹配结果求和:
dat <- dat %>% rowwise() %>% mutate(num_ap = sum(str_count(word, c("a", "p")))) %>% ungroup() # 运算完成后取消行分组,避免影响后续操作
方法3:用映射函数处理
使用purrr::map_dbl对每个单词单独做匹配和求和:
dat <- dat %>% mutate(num_ap = map_dbl(word, ~sum(str_count(.x, c("a", "p")))))
以上三种方法都可以得到你预期的num_ap结果c(3, 3, 2, 4)。
内容的提问来源于stack exchange,提问作者pd441
相关产品推荐
相关产品推荐

