【问题标题】:Conditional removal of duplicates based on NA基于 NA 有条件地删除重复项
【发布时间】:2019-12-03 22:58:47
【问题描述】:

我有一个包含两列的 df:SurveyIDSpecies

SurveyID=c(1,1,1,2,2,3,3,3)
Species=c(NA,NA,"GRSH",NA,NA,NA,"RAZO","RAZO")
df=data.frame(cbind(SurveyID,Species))

我想在两种情况下删除重复项: 1.删​​除所有具有相同survey IDNASpecies的重复项 2. 具有相同调查 ID 且混合有NASpecies(例如“RAZO”)的行仅通过删除带有NASpecies 的行来显示带有物种的行。

产品 df 应如下所示:

df2=data.frame(cbind(SurveyID=c(1,2,3,3),Species=c("GRSH",NA,"RAZO","RAZO")))

我尝试使用条件进行子设置,但这删除了重复的物种并保留了不需要的重复 SurveyID 行和 NA Species

df1= unique(df)
df1=df1[!is.na(df1$Species) | is.na(df1$Species)&!duplicated(df1$SurveyID),] 

有什么建议吗?我也是新手,所以如果我的问题需要澄清/格式化,请告诉我!

【问题讨论】:

    标签: r duplicates unique


    【解决方案1】:

    一个选项是

    library(dplyr)
    df %>%
       group_by(SurveyID) %>%
       filter(all(is.na(Species)) & !duplicated(is.na(Species))|!is.na(Species))
    # A tibble: 4 x 2
    # Groups:   SurveyID [3]
    #  SurveyID Species
    #  <fct>    <fct>  
    #1 1        GRSH   
    #2 2        <NA>   
    #3 3        RAZO   
    #4 3        RAZO   
    

    【讨论】:

      【解决方案2】:

      您可以通过过滤到所有非NA Species 值然后加入一个包含所有SurveyIDs 的表来做到这一点

      library(data.table)
      setDT(df)
      
      df[!is.na(Species)
         ][df[, .(new = unique(SurveyID))], on = c('SurveyID' = 'new')]
      
      #    SurveyID Species
      # 1:        1    GRSH
      # 2:        2    <NA>
      # 3:        3    RAZO
      # 4:        3    RAZO
      

      【讨论】:

        猜你喜欢
        • 2018-02-17
        • 1970-01-01
        • 2016-08-23
        • 1970-01-01
        • 2017-09-22
        • 1970-01-01
        • 2012-06-05
        • 2021-11-03
        相关资源
        最近更新 更多