示例数据:
mydf<-data.frame(Group_ID=c("337", "337", "201", "201", "470", "470", "999", "999"),
Timestamp=c("A", "A", "B", "B", "C", "D", "E", "F"),
MU=as.numeric(c("1", "1", "2", "3", "4", "4", "5", "6")))
Run Code Online (Sandbox Code Playgroud)
给出:
Group_ID Timestamp MU
337 A 1
337 A 1
201 B 2
201 B 3
470 C 4
470 D 4
999 E 5
999 F 6
Run Code Online (Sandbox Code Playgroud)
如果 MU 大于 1,我只想保留 Group_ID 中的第一个条目。如果 MU <= 1,我想保留该组的所有条目。因此,
想要的结果:
Group_ID Timestamp MU
337 A 1
337 A 1
201 B 2
470 C 4
999 E 5
Run Code Online (Sandbox Code Playgroud)
我做了很多尝试,最接近的是下面的例子。但是,此解决方案是错误的,因为它排除了 MU <= 1 的所有条目。
最佳尝试:
mydf <- mydf[(mydf$MU >= 1),] %>%
group_by(Group_ID) %>%
slice(1:1)
Run Code Online (Sandbox Code Playgroud)
返回不需要的结果(排除而不是保留所有 MU <= 1):
Group_ID Timestamp MU
201 B 2
337 A 1
470 C 4
999 E 5
Run Code Online (Sandbox Code Playgroud)
我很惊讶这种尝试不起作用,它缺少什么?我也试过ifelse声明。提前谢谢了
mydf %>%
group_by(Group_ID) %>%
filter(cumsum(MU > 1) <= 1) %>%
ungroup()
## A tibble: 5 x 3
# Group_ID Timestamp MU
# <fct> <fct> <dbl>
#1 337 A 1
#2 337 A 1
#3 201 B 2
#4 470 C 4
#5 999 E 5
Run Code Online (Sandbox Code Playgroud)
基本 R 等价物将是
mydf[with(mydf, ave(MU > 1, Group_ID, FUN = cumsum) <= 1),]
Run Code Online (Sandbox Code Playgroud)