如果上一行具有相同的值/字符串(对于每个组),则删除该行

时间:2018-08-03 13:55:30

标签: r

对于每个组,如果值与上一行匹配,我想删除该行

x <- c(1,1,1,1,2,2,2,2)
y <- c("A","B","B","A","A","A","B","B")
xy <- data.frame(x,y)
colnames(xy)<-c("group","value")
xy

它应该导致

x <- c(1,1,1,2,2)
y <- c("A","B","A","A","B")
result_df <- data.frame(x,y)
colnames(result_df)<-c("group","value")
result_df

认为我必须应用一些滞后的东西,但是我不明白。

4 个答案:

答案 0 :(得分:3)

您正确的认为lag是进行此比较的合适方法。首先,您group_by会使用组值,以便在每个类别中进行过滤,然后过滤出那些值等于lag(value)(即上一个值)的组。 is.na语句补偿每个组中的第一个滞后值为NA。

library(dplyr)
xy %>% group_by(group) %>%  filter(value!=lag(value) | is.na(lag(value)))
# A tibble: 5 x 2
# Groups:   group [2]
#   group value
#   <dbl> <fct>
# 1  1.00 A    
# 2  1.00 B    
# 3  1.00 A    
# 4  2.00 A    
# 5  2.00 B 

答案 1 :(得分:2)

n <- nrow(xy)
xy[!c(FALSE, rowMeans(xy[-1, ] == xy[-n, ]) == 1), ]
  group value
1     1     A
2     1     B
4     1     A
5     2     A
7     2     B

答案 2 :(得分:2)

一个简单的基础R解决方案。

xy[c(0, diff(duplicated(xy)))<1,]

  group value
1     1     A
2     1     B
4     1     A
5     2     A
7     2     B

答案 3 :(得分:1)

  

对于每个组,如果值与上一行匹配,我想删除该行

您可以使用data.table包中的rleidv对运行进行重复数据删除:

xy[!duplicated(data.table::rleidv(xy)), ]

  group value
1     1     A
2     1     B
4     1     A
5     2     A
7     2     B

如果xy中还有其他列,则您可以rleidv(xy, c("group", "value"))对其进行重复数据删除。

相关问题