【问题标题】:How to remove groups of observation with dplyr::filter()如何使用 dplyr::filter() 删除观察组
【发布时间】:2014-08-26 07:34:43
【问题描述】:

对于以下数据

ds <- read.table(header = TRUE, text ="
id year attend
1 2007      1
1 2008      1
1 2009      1
1 2010      1
1 2011      1
8 2007      3
8 2008     NA
8 2009      3
8 2010     NA
8 2011      3
9 2007      2
9 2008      3
9 2009      3
9 2010      5
9 2011      5
10 2007     4
10 2008     4
10 2009     2
10 2010    NA
10 2011    NA
")
ds<- ds %>% dplyr::mutate(time=year-2000)
print(ds)

我将如何编写一个 dplyr::filter() 命令来仅保留没有单个 NA 的 id?所以只有 id 为 1 和 9 的主题应该留在过滤器之后。

【问题讨论】:

    标签: r data-manipulation dplyr subset


    【解决方案1】:

    或者你可以使用:

    ds %>%
    group_by(id) %>% 
    filter(attend=all(!is.na(attend)))
    #Source: local data frame [10 x 3]
    #Groups: id
    
    #  id year attend
    #1   1 2007      1
    #2   1 2008      1
    #3   1 2009      1
    #4   1 2010      1
    #5   1 2011      1
    #6   9 2007      2
    #7   9 2008      3
    #8   9 2009      3
    #9   9 2010      5
    #10  9 2011      5
    

    【讨论】:

    • 我更喜欢这个,因为它在 dplyr 内并且更短。谢谢!
    • 还有filter(!anyNA(attend))
    【解决方案2】:

    filterbase::ave结合使用

    ds %>% dplyr::filter(ave(!is.na(attend), id, FUN = all))
    

    获得

        id year attend
     1   1 2007      1
     2   1 2008      1
     3   1 2009      1
     4   1 2010      1
     5   1 2011      1
     6   9 2007      2
     7   9 2008      3
     8   9 2009      3
     9   9 2010      5
     10  9 2011      5
    

    【讨论】:

    • 是的,1 和 9,我已经更正了。谢谢@Robert Krzyzanowski,这正是我所需要的。我以前从未见过 ave() 函数,我很高兴我问了,学到了一些新东西。
    • 我等了 2 分钟才接受它:) 再次感谢!
    猜你喜欢
    • 2015-05-05
    • 1970-01-01
    • 2021-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多