如何仅删除数据集首尾满足y=0条件的行?
问题描述
给定示例数据框:
df=data.frame(x=c(0,3,5,0,7,6,0),y=c(0,0,3,0,0,4,0),z=c(8,7,6,8,9,4,3))
需要删除首尾行中y=0的行(即第1、2、7行),但保留中间y=0的第4、5行。已知可通过filter(!y==0)过滤所有y=0的行,也可使用slice_head()和slice_tail()按位置删除,但无法固定行数。数据集共20万行,需按id、date分组处理,使用tidyverse工具。
解决方法
可以通过在分组后标记每组内第一个和最后一个y≠0的位置,再筛选这两个位置之间的所有行(包含两端),既能删除首尾的y=0行,又能保留中间的y=0行。具体代码如下:
library(tidyverse) # 为示例数据添加分组列(模拟真实场景) df <- df %>% mutate(id = 1, date = "2024-01-01") df_cleaned <- df %>% group_by(id, date) %>% mutate( # 获取每组第一个y≠0的行号 first_non_zero = min(which(y != 0)), # 获取每组最后一个y≠0的行号 last_non_zero = max(which(y != 0)) ) %>% # 筛选首尾非零行之间的所有行 filter(row_number() >= first_non_zero & row_number() <= last_non_zero) %>% # 清理临时标记列 select(-first_non_zero, -last_non_zero) %>% ungroup()
代码说明
group_by(id, date):按指定列分组,确保每个分组单独处理mutate块:通过which(y !=0)定位所有非零y的行,再用min和max分别取首尾非零行的位置filter:保留行号在首尾非零行之间的所有数据,自动剔除首尾的y=0行select和ungroup:移除临时生成的辅助列并取消分组
验证结果
处理后的数据将保留第3、4、5、6行,符合需求:
# 输出结果 # A tibble: 4 × 5 id date x y z <dbl> <chr> <dbl> <dbl> <dbl> 1 1 2024-01-01 5 3 6 2 1 2024-01-01 0 0 8 3 1 2024-01-01 7 0 9 4 1 2024-01-01 6 4 4
内容的提问来源于stack exchange,提问作者Bettina
相关产品推荐
相关产品推荐

