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

R语言:如何移除最后行为为Push的个体的最后一行数据?

问题:移除最后行为为"Push"的个体的最后一行数据

数据集结构

ID  Behavior  Order
A   Bucket    1
A   Tube      2
A   Bucket    3
A   Tube      4
A   Push      5
B   Bucket    1
B   Tube      2
B   Bucket    3
B   Tube      4
C   Bucket    1
C   Tube      2
C   Push      3
C   Bucket    4
C   Tube      5

需求说明

需要移除**最后一条行为为"Push"**的个体对应的最后一行数据。比如个体A的最后行为是Push,要删掉它的第5行;个体B、C的最后行为不是Push,保留所有行。

当前尝试的问题

已经通过以下代码筛选出最后行为为Push的个体列表:

LastBehaviour <- aggregate(Events[,"Behavior"], list(Events$Observation.id), tail, 1)
FixPush<-LastBehaviour[which(LastBehaviour$Behavior=="Push" ),"Group.1"]

但后续移除操作的代码仅删除了整个数据集的最后一行,而非目标个体的最后一行:

df <- df %>%
  group_by(Observation.id%in%FixPush)%>%
  arrange(Order)%>%
  head(-1) %>%
  glimpse()

解决方案

问题出在group_by的分组逻辑:用Observation.id%in%FixPush分组会把数据分成"符合条件/不符合条件"两组,而非按每个个体独立分组。正确做法是按个体ID分组后,在组内精准判断并移除目标行。

方法1:直接在分组内判断(无需提前生成FixPush)

library(dplyr)

df_cleaned <- df %>%
  group_by(Observation.id) %>%  # 按每个个体ID单独分组
  mutate(
    is_last_row = row_number() == n(),  # 标记组内最后一行
    last_behavior_push = last(Behavior) == "Push"  # 判断组内最后行为是否为Push
  ) %>%
  filter(!(is_last_row & last_behavior_push)) %>%  # 移除同时满足两个条件的行
  select(-is_last_row, -last_behavior_push) %>%  # 清理临时标记列
  ungroup()  # 取消分组

方法2:沿用已生成的FixPush列表

如果想保留之前得到的FixPush个体集合,可简化为:

df_cleaned <- df %>%
  group_by(Observation.id) %>%
  filter(!(Observation.id %in% FixPush & row_number() == n())) %>%  # 仅移除目标个体的最后一行
  ungroup()

两种方法都会精准删除每个符合条件个体的最后一行,不会影响其他个体的数据。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 19:20:13