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

如何仅删除数据集首尾满足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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 05:03:20