在具有NA的数据帧中使用聚合而不丢弃行

时间:2017-05-10 20:30:15

标签: r aggregate

我使用聚合来获取特定类别(cy)的几个变量的平均值,但我的数据框中有一些NA。我使用的是聚合而不是ddply,因为根据我的理解,它使用rm.na = TRUE来处理NA。问题是它会丢弃输出中包含NA的所有行,因此平均值稍微偏离。

数据框:

> bt cy cl pf ne YH YI 1 1 H 1 95 70.0 20 20 2 2 H 1 25 70.0 46 50 3 1 H 1 0 70.0 40 45 4 2 H 1 95 59.9 40 40 5 2 H 1 75 59.9 36 57 6 2 H 1 5 70.0 35 43 7 1 H 1 50 59.9 20 36 8 2 H 1 95 59.9 40 42 9 3 H 1 95 49.5 17 48 10 2 H 1 5 70.0 42 42 11 2 H 1 95 49.5 19 30 12 3 H 1 25 49.5 33 51 13 1 H 1 75 49.5 5 26 14 1 H 1 5 70.0 35 37 15 1 H 1 5 59.9 20 40 16 2 H 1 95 49.5 29 53 17 2 H 1 75 70.0 41 41 18 2 H 1 0 70.0 10 10 19 2 H 1 95 49.5 25 32 20 1 H 1 95 59.9 10 11 21 2 H 1 0 29.5 20 28 22 1 H 1 95 29.5 11 27 23 2 H 1 25 59.9 26 26 24 1 H 1 5 70.0 30 30 25 3 H 1 25 29.5 20 30 26 3 H 1 50 70.0 5 5 27 1 H 1 0 59.9 3 10 28 1 K 1 5 49.5 25 29 29 2 K 1 0 49.5 30 32 30 1 K 1 95 49.5 13 24 31 1 K 1 0 39.5 13 13 32 2 M 1 NA 70.0 45 50 33 3 M 1 25 59.9 3 34'

完整的数据框有74行,除了两列(cy和cl)之外的所有地方都有NA。

我的代码如下所示: meancnty<-(aggregate(cbind(pf,ne,YH,YI)~cy, data = newChart, FUN=mean))

我在excel中进行了双重检查,并且在删除包含NA的所有行之后,此函数产生的均值是针对N = 69的数据集。有没有办法告诉R忽略NA而不是删除行,除了按县选择每个变量的平均值(我有很多变量可以通过许多不同的类别进行总结)?

谢谢

2 个答案:

答案 0 :(得分:1)

使用dplyr

df %>%
  group_by(cy) %>%
  summarize_all(mean, na.rm = TRUE)

#      cy       bt        cl       pf       ne       YH       YI
# 1     H 1.785714 0.7209302 53.41463 51.75952 21.92857 29.40476
# 2     K 1.333333 0.8333333 33.33333 47.83333 20.66667 27.33333
# 3     M 1.777778 0.4444444 63.75000 58.68889 24.88889 44.22222
# 4     O 2.062500 0.8750000 31.66667 53.05333 18.06667 30.78571

答案 1 :(得分:0)

我认为这会奏效:

meancnty<-(aggregate(with(newChart(cbind(pf,ne,YH,YI), 
           by = list(newchart$cy), FUN=mean, na.rm=T))

我使用了以下测试数据:

> q<- data.frame(y = sample(c(0,1), 10, replace=T), a = runif(10, 1, 100), b=runif(10, 20,30))
> q$a[c(2, 5, 7)]<- NA
> q$b[c(1, 3, 4)]<- NA
> q
   y        a        b
1  0 86.87961       NA
2  0       NA 22.39432
3  0 89.38810       NA
4  0 12.96266       NA
5  1       NA 22.07757
6  0 73.96121 24.13154
7  0       NA 22.31431
8  1 62.77095 21.46395
9  0 55.28476 23.14393
10 0 14.01912 28.08305

使用上面的代码,我得到:

> aggregate(cbind(a,b)~y, data=q, mean, na.rm=T)
  y        a        b
1 0 47.75503 25.11951
2 1 62.77095 21.46395

这是错误的,即它删除所有NAs的行,然后取平均值。 然而,这给出了正确的结果:

> aggregate(with(q, cbind(a, b)), by = list(q$y), mean, na.rm=T)
  Group.1        a        b
1       0 55.41591 24.01343
2       1 62.77095 21.77076

首先按列na.rm=T,然后按组取平均值。

不幸的是,我不知道为什么会这样,但我的猜测是与y的类有关。