【发布时间】:2019-08-28 00:06:27
【问题描述】:
考虑以下示例数据:
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) 中删除一个条目。具体来说,我想删除他们未完成整个调查 (FINISHED == 0) 的那一行(或多行,如果在一天内完成 3 次以上)。
这可能与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
【问题讨论】:
-
@RonakShah 刚做了,谢谢你的建议。
-
这不是 tidyverse,而是
d[!(duplicated(d[c("ID","DAY")]) & d$FINISHED == 0),]- 如果你愿意的话,我怀疑它可以被塞进filter()。