You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在R数据框中删除与前一行指定列值重复的行?

如何在R语言中删除数据框中与前一行指定列值重复的行

没问题,我正好处理过类似的需求!你要的是只删除和紧挨着的前一行Time1值重复的观测,而不是和历史所有行重复的,对吧?咱们一步步来实现:

首先,先构造你给出的示例数据框,方便复现:

df <- data.frame(
  ID = 1:4,
  Time1 = c(6, 5, 5, 6),
  Time2 = c(7, 8, 9, 6)
)

方法一:基础R实现(无需额外包)

利用diff()函数计算Time1列相邻行的差值,只要差值不为0,就说明当前行和前一行值不同,需要保留。注意要给第一行单独加一个TRUE(因为diff()会比原向量少一个元素):

# 筛选出相邻行Time1不重复的观测
df_clean <- df[c(TRUE, diff(df$Time1) != 0), ]

运行后得到的df_clean就是你要的结果:

ID Time1 Time2
1  1     6     7
2  2     5     8
4  4     6     6

方法二:用dplyr包(tidyverse生态)

如果你习惯用tidyverse的语法,可以用lag()函数获取前一行的Time1值,然后通过filter()筛选出符合条件的行:

# 先安装并加载dplyr(如果没装过的话)
# install.packages("dplyr")
library(dplyr)

df_clean <- df %>%
  # 第一行没有前一行,直接保留;后续行只要Time1不等于前一行就保留
  filter(is.na(lag(Time1)) | Time1 != lag(Time1))

这个方法的逻辑更直观:lag(Time1)会返回当前行的前一行Time1值,第一行的lag(Time1)NA,所以用is.na(lag(Time1))确保第一行被保留,后续行只要和前一行的值不同就留下。

关键注意点

一定要区分相邻行重复全局重复:如果用unique(df$Time1)或者不带参数的distinct(),会把所有Time1值重复的行都删掉,包括第4行(和第1行Time1都是6),这不符合你的需求。我们的方法只关注当前行和紧挨着的前一行的比较,完美匹配你的要求。

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

火山引擎 最新活动