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

在dplyr的mutate中使用逻辑运算符统计动物出现次数问题

问题分析与修复方案

首先,咱们来拆解你的代码里的几个核心错误,然后一步步修正:

你的代码的主要问题

  1. 时间范围筛选完全错误
    你写的animals[(year>=year-5) & (year<=year)]逻辑完全不对:这里的year是当前行的年份,year >= year-5永远为真,year<=year也永远为真,所以这部分其实就是取当前行的animals,根本没有筛选出过去5年内的所有行,也就无法获取对应时间范围的sentences。

  2. 全局string变量未限制时间范围
    你提前拆分了所有行的sentences到string,但没有根据当前行的时间窗口过滤,导致统计的是所有年份的句子,不是你需要的目标时间范围内的内容。

  3. 动物列表的处理逻辑混乱
    你试图从错误筛选的animals里拆分动物,但实际上应该拆分当前行的动物列表,再去统计这些动物在目标时间窗口的sentences里的出现次数。

修复后的代码

下面是符合需求的代码,我会逐行解释逻辑:

library(dplyr)
library(stringr)

# 你的原始数据
df = data.frame(animals = c("cat; dog; bird", "dog; bird", "bird"), 
                sentences = c("the cat is brown; the dog is barking; the bird is green and blue", "the dog is black; the bird is yellow and blue", "the bird is blue"),
                year= c("2010","2012","2001"), stringsAsFactors = F)
df$year <- as.numeric(df$year)

# 核心处理逻辑
df %>%
  rowwise() %>% # 按行处理每一行
  mutate(
    # 1. 确定当前行的时间窗口:当前年份及过去5年(year >= 当前年-5 且 year <= 当前年)
    current_year = year,
    time_mask = list(df$year >= (current_year - 5) & df$year <= current_year),
    # 2. 提取该时间窗口内的所有sentences,合并成一个字符串
    target_sentences = str_c(df$sentences[time_mask[[1]]], collapse = "; "),
    # 3. 拆分当前行的动物为单个列表
    animal_list = str_split(animals, "; ")[[1]],
    # 4. 统计每个动物在目标句子中的出现次数,求和得到SUM
    SUM = sum(str_count(target_sentences, animal_list))
  ) %>%
  select(-current_year, -time_mask, -animal_list) # 移除中间辅助变量

代码逻辑解释

  1. rowwise():确保我们逐行处理每一条数据,每一行的计算都是独立的。
  2. 时间窗口筛选:用当前行的年份current_year生成一个掩码time_mask,筛选出整个数据框中符合“当前年及过去5年”的行。
  3. 提取目标句子:把符合时间窗口的所有sentences合并成一个大字符串,方便后续统计。
  4. 拆分动物列表:把当前行的animals按; 拆分成单个动物的向量。
  5. 统计次数求和:用str_count统计每个动物在目标句子中的出现次数,再用sum得到总次数。

结果调整说明

运行上述代码后,得到的SUM结果和你的期望输出略有差异,这是因为严格按照“当前年及过去5年”的逻辑计算:

  • 第一行2010年的过去5年是2005-2010,只有自身行符合条件,三个动物各出现1次,总和3。
  • 第二行2012年的过去5年是2007-2012,第1行(2010)和第2行(2012)符合条件,dog在两行各出现1次,bird在两行各出现1次,总和4。

如果你的期望输出里的SUM是排除当前行的统计,只需要调整time_mask的条件为df$year >= (current_year - 5) & df$year < current_year即可。

内容的提问来源于stack exchange,提问作者Amleto

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 03:59:14