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

R语言按Event ID分组并按条件筛选行为列的需求

R语言数据分组处理问题解决方案

问题描述

现有包含Event ID、Species、Behaviour列的表格,同一事件的记录共用相同Event ID。需要按Event ID分组后对Behaviour列执行以下规则:

  • 若组内存在非“Pass”的行为,则保留这些行为(多个用逗号分隔,去重)
  • 若组内仅存在“Pass”,则保留“Pass”

当前使用group_by+summarise的max方法仅能返回出现次数最多的行为,无法满足需求,需实现正确方案。

原始数据

Event IDSpeciesBehaviour
E0001foxPass
E0002CatPass
E0002CatRest
E0002CatPass
E0003HareForage
E0003HarePass
E0004foxForage
E0004foxForage
E0004foxRest

期望结果

Event_IDBehaviour
E0001Pass
E0002Rest
E0003Forage
E0004Forage, Rest

尝试的错误代码

event_bhv <- data %>% group_by(Event_ID) %>% summarise(event_behaviour = max(Behaviour))

正确实现方案

使用dplyr包的分组、过滤去重与条件判断即可实现需求,代码如下:

library(dplyr)

# 先统一列名(避免空格带来的语法问题)
data <- data %>% rename(Event_ID = `Event ID`)

event_bhv <- data %>%
  group_by(Event_ID) %>%
  summarise(
    Behaviour = {
      # 提取组内非Pass的唯一行为
      non_pass_behaviours <- unique(Behaviour[Behaviour != "Pass"])
      # 根据是否存在非Pass行为返回对应结果
      if (length(non_pass_behaviours) > 0) {
        paste(non_pass_behaviours, collapse = ", ")
      } else {
        "Pass"
      }
    }
  )

代码说明

  1. 列名统一:将带空格的Event ID重命名为Event_ID,避免后续代码出现语法错误
  2. 分组逻辑:按Event_ID分组后,在summarise中完成核心判断:
    • 筛选并去重组内所有非“Pass”的行为
    • 若存在非“Pass”行为,用逗号拼接成字符串;若不存在,则返回“Pass”

运行上述代码后即可得到符合需求的结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 07:33:09