【发布时间】: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 %>% group_by(group) %>% filter(sum(!is.na(y))>=3) %>% mutate(Mean=mean(x, na.rm=TRUE)) -
是的,对不起,这就是我的意思。但是您的帮助使我找到了我正在寻找的解决方案:
df %>% group_by(x) %>% filter(sum(!is.na(y))>=3) %>% mutate(Mean=mean(x, na.rm=TRUE))非常感谢! -
@beetroot 为什么要按
x分组? Akrun 的似乎更合适。加上列名是 group -
@RichardScriven 如果我按组分组,那么那些不满足过滤条件的组将被完全删除,如果我按 x 分组,则仅删除相应的行。
-
@beetroot 感谢您的澄清。但是,从您的帖子中并不太清楚,通过执行
mutate,您不会得到与 x 列中相同的值吗?