使用 tidyverse 删除给定特定条件的重复条目

标签 r dplyr

考虑以下示例数据:

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/

相关文章:

r - 如何让 Shiny 应用程序连续读取文件?

r - Caret 的 train() 和 resamples() 反转 GLM 的敏感性/特异性

r - 将变量与其中许多数据包含在 R 中的行中的变量连接起来

r - 求 R 中行对的总和

r - 按类别获取最大值作为 R 中的新列

javascript - 单击嵌入 Shiny 的 googlevis 折线图中的图例时如何隐藏系列

sql - 当添加的列较少时,追加到现有的SQLite表,而无需将数据库读入R

r - 使用 dplyr 计算 group_by 中的子组

r - 将多个数据帧复制到 R 中的 SQLite 数据库

c++ - 从 C++ 程序调用 R(在 Linux 中)