考虑以下示例数据:
library(dplyr)
d <- tibble("ID" = rep(c(1111, 2222, 3333, 4444), each = 4),
"DAY" = c(1, 2, 3, 4, 1, 2, 2, 3, 1, 2, 3, 4, 1, 2, 3, 4),
"FINISHED" = c(1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0))
我想从完成给定日期 (DAY
) 两次调查的参与者 (ID
) 中删除一个条目。具体来说,我想删除他们未完成整个调查的那一行(或多行,如果在给定的一天完成 3 次以上)(FINISHED == 0
)。
这可能与 group_by
相关吗?欢迎使用任何 tidyverse
解决方案。
预期输出(删除第 7 行):
# A tibble: 16 x 3
ID DAY FINISHED
<dbl> <dbl> <dbl>
1 1111 1 1
2 1111 2 1
3 1111 3 1
4 1111 4 1
5 2222 1 1
6 2222 2 1
8 2222 3 1
9 3333 1 1
10 3333 2 1
11 3333 3 1
12 3333 4 1
13 4444 1 1
14 4444 2 1
15 4444 3 1
16 4444 4 0
编辑:
如果参与者在某一天参加了 2 次以上的调查并完成了两次 (FINISH == 1
),我想删除最早完成的(即保持最接近今天的日期)。这是一个扩展的示例数据集:
library(dplyr)
library(lubridate)
d <- tibble("ID" = rep(c(1111, 2222, 3333, 4444), each = 4),
"DAY" = c(1, 2, 3, 3, 1, 2, 2, 3, 1, 2, 3, 4, 1, 2, 3, 4),
"FINISHED" = c(1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0),
"DATE" = as_date(c("2019-08-01", "2019-08-02", "2019-08-03", "2019-08-04",
"2019-08-01", "2019-08-02", "2019-08-02", "2019-08-03",
"2019-08-01", "2019-08-02", "2019-08-03", "2019-08-04",
"2019-08-01", "2019-08-02", "2019-08-03", "2019-08-04")))
以及预期的输出(删除第 3、7 行):
# A tibble: 16 x 4
ID DAY FINISHED DATE
<dbl> <dbl> <dbl> <date>
1 1111 1 1 2019-08-01
2 1111 2 1 2019-08-02
4 1111 3 1 2019-08-04
5 2222 1 1 2019-08-01
6 2222 2 1 2019-08-02
8 2222 3 1 2019-08-03
9 3333 1 1 2019-08-01
10 3333 2 1 2019-08-02
11 3333 3 1 2019-08-03
12 3333 4 1 2019-08-04
13 4444 1 1 2019-08-01
14 4444 2 1 2019-08-02
15 4444 3 1 2019-08-03
16 4444 4 0 2019-08-04
最佳答案
这是 dplyr
中的一种方法,它使用 FINISHED == 0
过滤掉重复的 DAY
仅用于 ID
有 3 天以上的时间。 -
d %>%
group_by(ID) %>%
filter(n() >= 3 & !(duplicated(DAY) & FINISHED == 0)) %>%
ungroup()
# A tibble: 15 x 3
ID DAY FINISHED
<dbl> <dbl> <dbl>
1 1111 1 1
2 1111 2 1
3 1111 3 1
4 1111 4 1
5 2222 1 1
6 2222 2 1
7 2222 3 1
8 3333 1 1
9 3333 2 1
10 3333 3 1
11 3333 4 1
12 4444 1 1
13 4444 2 1
14 4444 3 1
15 4444 4 0
关于使用 tidyverse 删除给定特定条件的重复条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57683509/