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

4
对于每个组,如果值与前一行匹配,则删除该行。
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个回答

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 

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
一个简单的基于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

1

对于每个组,如果值与前一行匹配,则想要删除该行

您可以使用数据表包中的 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")) 仅在这些列上进行去重。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接