【问题标题】:Filter based on NA in dplyrdplyr中基于NA的过滤器
【发布时间】:2015-01-16 16:33:19
【问题描述】:

这是我的 df

df <- structure(structure(list(group = structure(c(1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 4L, 5L, 5L, 5L, 5L, 5L), .Label = c("A", "B", "C", "D", "E"), class = "factor"), y = c(NA, NA, NA, NA, 1, NA, NA, NA, 1, 2, NA, NA, 1, 2, 3, NA, 2, 2, 3, 4, NA, 3, 3, 4, 5), x = c(1L, 2L, 3L, 4L,5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L)), .Names = c("group", "y", "x"), row.names = c(NA, 25L), class = "data.frame"))

> df
   group  y x
1      A NA 1
2      A NA 2
3      A NA 3
4      A NA 4
5      A  1 5
6      B NA 1
7      B NA 2
8      B NA 3
9      B  1 4
10     B  2 5
11     C NA 1
12     C NA 2
13     C  1 3
14     C  2 4
15     C  3 5
16     D NA 1
17     D  2 2
18     D  2 3
19     D  3 4
20     D  4 5
21     E NA 1
22     E  3 2
23     E  3 3
24     E  4 4
25     E  5 5

我的目标是使用mutate 计算每个 x 值的平均值(跨组)。但首先我想过滤数据,以便只保留那些至少有 3 个非 NA 值的 x 值。所以在这个例子中,我只想包括那些 x 至少为 3 的条目。我不知道如何创建 filter(),有什么建议吗?

【问题讨论】:

  • 我认为信息不清楚。您说至少有 3 个非 NA 值,是在 y 列中吗?因为 x 没有任何 NA 值。如果是这样的话df %&gt;% group_by(group) %&gt;% filter(sum(!is.na(y))&gt;=3) %&gt;% mutate(Mean=mean(x, na.rm=TRUE))
  • 是的,对不起,这就是我的意思。但是您的帮助使我找到了我正在寻找的解决方案:df %&gt;% group_by(x) %&gt;% filter(sum(!is.na(y))&gt;=3) %&gt;% mutate(Mean=mean(x, na.rm=TRUE)) 非常感谢!
  • @beetroot 为什么要按x 分组? Akrun 的似乎更合适。加上列名是 group
  • @RichardScriven 如果我按组分组,那么那些不满足过滤条件的组将被完全删除,如果我按 x 分组,则仅删除相应的行。
  • @beetroot 感谢您的澄清。但是,从您的帖子中并不太清楚,通过执行mutate,您不会得到与 x 列中相同的值吗?

标签: r dplyr


【解决方案1】:

你可以试试

df %>% 
   group_by(group) %>% #group_by(x) %>% #as per the OP's clarification
   filter(sum(!is.na(y))>=3) %>% 
   mutate(Mean=mean(x, na.rm=TRUE))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-12
    • 1970-01-01
    • 1970-01-01
    • 2018-02-19
    • 2015-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多