You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 00:50:28