如何根据另一列中的缺失数据删除重复项?

4

我有一个数据集,长这样:

   Study_ID Recurrent_Status
1       100                1
2       100               NA
3       100               NA
4       200                1
5       300               NA
6       400                3
7       400               NA
8       500                3
9       500               NA
10      600               NA
11      700                1


我想要移除重复的研究ID,但保留有“复发状态”数据的条目。换句话说,我想删除每个重复的研究ID,其中“复发状态”为NA。复发状态可以是1或3(或某些未重复患者的NA值)。
我的期望输出应该类似于这样:
  Study_ID Recurrent_Status
1      100                1
2      200                1
3      300               NA
4      400                3
5      500                3
6      600               NA
7      700                1


我尝试使用这段代码,但它当然会删除那些具有重复状态1或3的个体,而不是保留它们。
full_data<-filter(full_data, !duplicated(MRN, fromLast = TRUE) | Recurrence_status !="1")
full_data<-filter(full_data, !duplicated(MRN, fromLast = TRUE) | Recurrence_status !="3")

尝试移除感叹号时,出现以下错误:
full_data<-filter(full_data, !duplicated(MRN, fromLast = TRUE) | Recurrence_status ="1")

Error: unexpected '=' in "full_data<-filter(full_data, !duplicated(MRN, fromLast = TRUE) | Recurrence_status ="

我该怎样开始做这个?

可重现的数据:

data<-data.frame(Study_ID=c("100","100","100","200","300","400","400","500","500","600","700"),Recurrent_Status=c("1","NA","NA","1","NA","3","NA","3","NA","NA","1"))
4个回答

3

我们可以按照'Recurrent_Status'中非NA元素以及第一列来进行排列,然后使用distinct

library(dplyr)
data %>% 
  arrange(Study_ID, is.na(Recurrent_Status)) %>%
  distinct(Study_ID, .keep_all = TRUE)

-输出

  Study_ID Recurrent_Status
1      100                1
2      200                1
3      300               NA
4      400                3
5      500                3
6      600               NA
7      700                1

3

另一个 dplyr 选项:

df <- read.table(text = "   Study_ID Recurrent_Status
1       100                1
2       100               NA
3       100               NA
4       200                1
5       300               NA
6       400                3
7       400               NA
8       500                3
9       500               NA
10      600               NA
11      700                1", header = TRUE)

library(dplyr)
df %>%
  group_by(Study_ID) %>%
  slice(which.max(!is.na(Recurrent_Status)))
#> # A tibble: 7 × 2
#> # Groups:   Study_ID [7]
#>   Study_ID Recurrent_Status
#>      <int>            <int>
#> 1      100                1
#> 2      200                1
#> 3      300               NA
#> 4      400                3
#> 5      500                3
#> 6      600               NA
#> 7      700                1

本文创建于2022年7月18日,使用reprex软件包(版本2.0.1)


2

在这里,我们将分组并排列,保留第一个条目:

library(dplyr)

data %>% 
  group_by(Study_ID) %>% 
  arrange(Recurrent_Status, .by_group = TRUE) %>% 
  slice(1)

 Study_ID Recurrent_Status
  <chr>    <chr>           
1 100      1               
2 200      1               
3 300      NA              
4 400      3               
5 500      3               
6 600      NA              
7 700      1  

1
data %>%
   group_by(Study_ID) %>%
   filter(!is.na(Recurrent_Status)|all(is.na(Recurrent_Status)))

# A tibble: 7 x 2
# Groups:   Study_ID [7]
  Study_ID Recurrent_Status
     <int>            <int>
1      100                1
2      200                1
3      300               NA
4      400                3
5      500                3
6      600               NA
7      700                1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接