【问题标题】:How to remove duplicates based on missing data in another column?如何根据另一列中的缺失数据删除重复项?
【发布时间】:2022-07-18 23:58:53
【问题描述】:

我有一个如下所示的数据集:

   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"))

【问题讨论】:

    标签: r dplyr filter duplicates


    【解决方案1】:

    我们可以通过'Recurrent_Status'中的非NA元素与第一列一起arrange,然后使用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
    

    【讨论】:

      【解决方案2】:

      另一个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
      

      reprex package (v2.0.1) 于 2022-07-18 创建

      【讨论】:

        【解决方案3】:
        data %>% 
          group_by(Study_ID) %>% 
          arrange(Recurrent_Status, .by_group = TRUE) %>% 
          slice(1)
        

        【讨论】:

          猜你喜欢
          • 2018-12-01
          • 2017-07-28
          • 2021-12-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-05-27
          • 2020-06-22
          • 2017-12-17
          相关资源
          最近更新 更多