【问题标题】:Remove group that has NAs in only some rows删除仅在某些行中具有 NA 的组
【发布时间】:2018-10-02 20:23:58
【问题描述】:

我需要删除一年中每一天都没有测量值的年份。假设这是一整套,我想摆脱所有 2001 行,因为 2001 缺少一个测量值。

year    day    value  
2000     1       5
2000     2       3  
2000     3       2
2000     4       3  
2001     1       2
2001     2       NA  
2001     3       6  
2001     4       5

抱歉,我没有代码尝试,我现在无法理解它,我花了很长时间才走到这一步。更喜欢我可以 %>% 加入的东西,因为它是长期的结束。

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    根据NA 值的存在进行过滤:

    df %>% 
     group_by(year) %>%
     filter(!anyNA(value))
    

    替代filter 条件(选择您认为最易读的内容):

    all(!is.na(value))
    sum(is.na(value)) == 0
    !any(is.na(value))
    

    【讨论】:

    【解决方案2】:

    这是使用基础 R 的单行解决方案 -

    df %>% .[!ave(.$value, .$year, FUN = anyNA), ]
    

    例子-

    df <- data.frame(year = c(rep(2000, 4), rep(2001, 4)), day = 1:4, value = sample.int(10, 8))
    df$value[6] <- NA_integer_
    
    #   year day value
    # 1 2000   1     4
    # 2 2000   2     3
    # 3 2000   3     2
    # 4 2000   4     7
    # 5 2001   1     8
    # 6 2001   2    NA
    # 7 2001   3     1
    # 8 2001   4     5
    
    df %>% .[!ave(.$value, .$year, FUN = anyNA), ]
    
    #   year day value
    # 1 2000   1     4
    # 2 2000   2     3
    # 3 2000   3     2
    # 4 2000   4     7
    

    【讨论】:

    • 我建议subset(df,!ave(value, year, FUN = anyNA)) 留在base R
    【解决方案3】:

    在基础 R 中你可以这样做:

    subset(df,!year %in% year[is.na(value)])
    #   year day value
    # 1 2000   1     8
    # 2 2000   2     5
    # 3 2000   3     4
    # 4 2000   4     1
    

    【讨论】:

      猜你喜欢
      • 2019-01-06
      • 2015-10-19
      • 2012-10-12
      • 2014-05-12
      • 2018-12-15
      • 2022-06-13
      • 2017-06-12
      • 2014-11-13
      • 1970-01-01
      相关资源
      最近更新 更多