根据 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)
我有一个包含 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)