删除仅基于上一行的重复行

时间:2016-09-23 19:51:02

标签: r dataframe

我正在尝试从数据框中删除重复的行,仅基于前一行。 duplicateunique函数将删除所有重复项,只留下唯一的行,这不是我想要的。

我用循环说明了这里的问题。我需要对此进行矢量化,因为我的实际数据集要大得多,才能使用循环。

x <- c(1,1,1,1,3,3,3,4)
y <- c(1,1,1,1,3,3,3,4)
z <- c(1,2,1,1,3,2,2,4)
xy <- data.frame(x,y,z)

xy
  x y z
1 1 1 1
2 1 1 2
3 1 1 1
4 1 1 1 #this should be removed
5 3 3 3
6 3 3 2
7 3 3 2 #this should be removed
8 4 4 4

# loop that produces desired output
toRemove <- NULL
for (i in 2:nrow(xy)){
   test <- as.vector(xy[i,] == xy[i-1,])
   if (!(FALSE %in% test)){ 
      toRemove <- c(toRemove, i) #build a vector of rows to remove
   }
}
xy[-toRemove,] #exclude rows
  x y z
1 1 1 1
2 1 1 2
3 1 1 1
5 3 3 3
6 3 3 2
8 4 4 4

我尝试过使用dplyr的lag函数,但它仅适用于单列,当我尝试在所有3列上运行它时,它不起作用。

ifelse(xy[,1:3] == lag(xy[,1:3],1), NA, xy[,1:3])

关于如何实现这一目标的任何建议?

2 个答案:

答案 0 :(得分:5)

如果行与上面的行相同,我们想要删除:

# make an index, if cols not same as above
ix <- c(TRUE, rowSums(tail(xy, -1) == head(xy, -1)) != ncol(xy))

# filter
xy[ix, ]

答案 1 :(得分:-2)

为什么不直接迭代列表,同时跟踪前一行以将其与下一行进行比较?

如果在某些时候这是真的:记住行位置并将其从列表中删除然后从列表的开头开始迭代。 在迭代时不要删除行,因为你会得到并发修改错误。