对于每个组,如果值与上一行匹配,我想删除该行
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
认为我必须应用一些滞后的东西,但是我不明白。
答案 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"))
对其进行重复数据删除。