如何在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




