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
相关产品推荐
相关产品推荐

