R语言按年份分组统计多列指定字符串出现次数的错误排查
按年份分组统计多列字符串出现次数的问题修复
问题描述
需求:按年份分组,统计指定字符串在多个变量(列)中的出现次数。
原代码:
year <- c("1993", "1994", "1995") var1 <- c("tardigrades are usually about 0.5 mm long when fully grown.", "slow steppers", "easy") var2 <- c("something", "polar bear", "tardigrades are prevalent in mosses and lichens and feed on plant cells") var3 <- c("kleiner wasserbaer", "newly hatched", "happy learning") tardigrades <- data.frame(year, var1, var2, var3) count_year <- tardigrades %>% group_by(year) %>% summarize(count = sum(str_count(tardigrades, 'tardigrades')))
运行后问题:每个年份对应的统计结果都是整个数据集的总次数,没有实现分组统计的效果。
错误原因
在summarize函数里调用str_count(tardigrades, 'tardigrades')时,直接引用了整个原始数据框,而不是分组后的当前组数据。dplyr分组后,summarize上下文里应该用.指代当前分组的子数据集,或者让函数自动识别当前分组数据,否则每次都会计算全量数据的结果。
修正方案
方案一:用.指代当前分组数据
library(dplyr) library(stringr) year <- c("1993", "1994", "1995") var1 <- c("tardigrades are usually about 0.5 mm long when fully grown.", "slow steppers", "easy") var2 <- c("something", "polar bear", "tardigrades are prevalent in mosses and lichens and feed on plant cells") var3 <- c("kleiner wasserbaer", "newly hatched", "happy learning") tardigrades <- data.frame(year, var1, var2, var3) count_year <- tardigrades %>% group_by(year) %>% summarize(count = sum(str_count(., 'tardigrades')))
方案二:精准指定统计列(更严谨)
如果不想统计year列(虽然本例中year无目标字符串),可以用c_across明确指定要统计的列范围:
count_year <- tardigrades %>% group_by(year) %>% summarize(count = sum(str_count(c_across(var1:var3), 'tardigrades')))
效果说明
修正后运行代码,会得到正确的分组统计结果:
- 1993年:1次(仅var1中出现)
- 1994年:0次
- 1995年:1次(仅var2中出现)
内容的提问来源于stack exchange,提问作者onlyjust17
相关产品推荐
相关产品推荐

