我确信这很简单,但却找不到答案。我有一个像这样的数据框
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
事件。
提前致谢!
答案 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)
使用tapply
和rle
的基础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)