如果行与上一行相同,则删除行,但一列除外

时间:2017-03-07 17:45:42

标签: r dataframe duplicates row

我有以下数据框

x <- data.frame(id = c(1:6), 
                a = c('a', 'b', 'b', 'a', 'a', 'c'), 
                b = rep(2, 6), 
                c = c(5, 4, 4, 5, 5, 2))

> x
  id a b c
1  1 a 2 5
2  2 b 2 4
3  3 b 2 4
4  4 a 2 5
5  5 a 2 5
6  6 c 2 2

我想以

结束
  id a b c
1  1 a 2 5
2  2 b 2 4
4  4 a 2 5
6  6 c 2 2

要求是我想删除该行,如果它与上一行相同,但列id除外。如果它与列中的列相同但不是之前的列,我不想摆脱它。例如,id4与id1相同但未被删除,因为它不在其上方。

任何帮助将不胜感激

2 个答案:

答案 0 :(得分:3)

我们可以使用base R

x[!c(FALSE, !rowSums(x[-1, -1] != x[-nrow(x), -1])),]
#  id a b c
#1  1 a 2 5
#2  2 b 2 4
#4  4 a 2 5
#6  6 c 2 2

答案 1 :(得分:2)

以下是lag中使用dplyr函数的方法。我们的想法是创建一个关键列,并检查它是否与前一列相同。

library(dplyr)
x %>% 
  mutate(key=paste(a, b, c, sep="|")) %>%
  filter(key != lag(key, default="0")) %>% 
  select(-key)