R:在保持顺序的同时折叠列中的重复值

时间:2018-05-29 13:51:23

标签: r dplyr unique distinct

我确信这很简单,但却找不到答案。我有一个像这样的数据框

    Id  event
1   1   A
2   1   B
3   1   A
4   1   A
5   2   C
6   2   C
7   2   A

我想按Id进行分组并折叠不同的event值,同时保持事件顺序

    Id  event
1   1   A
2   1   B
3   1   A
4   2   C
5   2   A

我的大部分搜索结果都是使用distinct()unique()函数,但导致A 1行第3行失去Id事件。

提前致谢!

5 个答案:

答案 0 :(得分:3)

您可以将每一行与之后的一行进行比较。

server.Disconnect();

答案 1 :(得分:2)

我们可以使用lead来比较每行和filter与前一行不同的行。 is.na(lead(Id))也包含最后一行。

library(dplyr)

dat2 <- dat %>% 
  filter(!(Id == lead(Id) & event == lead(event)) | is.na(lead(Id)))
dat2
#   Id event
# 1  1     A
# 2  1     B
# 3  1     A
# 4  2     C
# 5  2     A

数据

dat <- read.table(text = "    Id  event
1   1   A
                  2   1   B
                  3   1   A
                  4   1   A
                  5   2   C
                  6   2   C
                  7   2   A",
                  header = TRUE, stringsAsFactors = FALSE)

答案 2 :(得分:2)

以下是data.table的解决方案:

library("data.table")
dt <- fread(
" Id  event
   1   A
   1   B
   1   A
   1   A
   2   C
   2   C
   2   A")
unique(dt[, r:=rleidv(event), Id])[, -3]
#    Id event
# 1:  1     A
# 2:  1     B
# 3:  1     A
# 4:  2     C
# 5:  2     A

dt[, .SD[unique(rleidv(event))], by = Id]

(thx to @ mt1022 for the comment)

答案 3 :(得分:0)

使用tapplyrle的基础R解决方案:

x <- tapply(dat$event,dat$Id,function(x) rle(x)$values)
do.call(rbind,Map(data.frame,Id=names(x),event=x))
#     Id event
# 1.1  1     A
# 1.2  1     B
# 1.3  1     A
# 2.1  2     C
# 2.2  2     A

答案 4 :(得分:0)

我认为distinct函数将能够解决问题。

dat %>% distinct(Id, event)