基于dplyr的NA过滤

7

这是我的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 %>% group_by(group) %>% filter(sum(!is.na(y))>=3) %>% mutate(Mean=mean(x, na.rm=TRUE)) - akrun
是的,抱歉,那就是我想表达的意思。但是你的帮助让我找到了我要寻找的解决方案:df %>% group_by(x) %>% filter(sum(!is.na(y))>=3) %>% mutate(Mean=mean(x, na.rm=TRUE)),非常感谢! - erc
@beetroot 为什么要按 x 分组?Akrun 的方法更合适。而且列名是 group - Rich Scriven
如果我按组分组,则不符合过滤条件的组将被完全删除,如果只按x分组,那么相应的行将被删除。 - erc
@beetroot 感谢您的澄清。但是,从您的帖子中并不是很清楚,通过执行 mutate,您是否会获得与 x 列中相同的值? - akrun
1个回答

10

你可以尝试一下

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接