根据 2 列查找重复行并根据 R 中第 3 列的值保留行

Find duplicate rows based on 2 columns and keep rows based on the value of a 3rd column in R

我有一个包含 ID 号、日期和测试结果的数据集,需要创建一个最终数据集,其中每一行都包含唯一的 ID、日期和测试结果值。如何根据 ID 和日期查找重复项,然后根据特定的测试结果值保留行?

df <- data.frame(id_number = c(1, 1, 2, 2, 3, 3, 3, 4),
                 date = c('2021-11-03', '2021-11-19', '2021-11-11', '2021-11-11', '2021-11-05', '2021-11-05', '2021-11-16', '2021-11-29'),
                 result = c(0,1,0,0,0,9,0,9) )

  id_number date       result
      <dbl> <chr>       <dbl>
1         1 2021-11-03      0
2         1 2021-11-19      1
3         2 2021-11-11      0
4         2 2021-11-11      0
5         3 2021-11-05      0
6         3 2021-11-05      9
7         3 2021-11-16      0
8         4 2021-11-29      9

df <- unique(df)

使用unique函数后,我仍然有重复的行id_number和日期,以及不同的测试结果。其中,我只需要保留等于 0 或 1 的行,并排除任何 9。

在下面的示例中,我想保留第 4 行并排除第 5 行。我不能简单地排除结果 = 9 的行,因为我想保留那些用于任何非重复观察。

  id_number date       result
      <dbl> <chr>       <dbl>
1         1 2021-11-03      0
2         1 2021-11-19      1
3         2 2021-11-11      0
4         3 2021-11-05      0
5         3 2021-11-05      9
6         3 2021-11-16      0
7         4 2021-11-29      9

你可以这样做:

library(tidyverse)

df %>%
  group_by(id_number, date) %>%
  filter(!(result == 9 & row_number() > 1)) %>%
  ungroup()

# A tibble: 6 x 3
  id_number date       result
      <dbl> <chr>       <dbl>
1         1 2021-11-03      0
2         1 2021-11-19      1
3         2 2021-11-11      0
4         3 2021-11-05      0
5         3 2021-11-16      0
6         4 2021-11-29      9

为了便于理解,使用:

a) 不同于 9 的行:

df <- subset(df,df$result != 9)

然后

b) 删除重复项:

df <- subset(df, duplicated(df)==FALSE)

因此,如果您需要特定的列:

df <- subset(df,duplicated(df$result)==FALSE)

或:

df <- subset(df,duplicated(df[ ,2:3])==FALSE)