我对r很陌生,所以我现在有点困惑。
我在一个列表上使用聚合函数,现在它正确地生成所有值,除了那些包含NA的列。我在计算均值。
所讨论的数据如下
AreaSize constructionYear
6 30 1980
7 30 NA
13 30 1969
现在聚合表给出了这个。
SegGroup listPrice rent livingArea constructionYear soldPrice
1 20 2383750 1353.0 25.87500 1927.5 2813750
2 30 2161667 1856.0 36.50000 NA 2428333
3 40 3548333 2381.0 44.16667 NA 3858333
4 50 2261667 3601.0 56.66667 NA 2616667
5 60 2395000 3320.0 63.00000 1954.0 2700000
6 70 3837500 3274.0 72.50000 1946.5 3942500
7 80 3335000 4759.5 82.75000 1986.0 3400000
8 90 2720000 4017.5 92.50000 1950.0 3475000
即使na。动作= na。省略聚合函数(默认设置)。怎么了?
代码listPrice <- aggregate(lOriginal[-length(lOriginal)], list(lOriginal$AreaSize), FUN = mean)
根据aggregate
的帮助,na.action = na.omit
是公式对象方法中的默认值,而不是数据帧方法中的默认值。使用哪个方法由函数调用中第一个参数的类决定。
我没有你的数据,所以我用数据集mtcars
向你展示这意味着什么,它包含在R中,经过修改(这是需要的,因为mtcars
不包含NA
):
mtcars[5, "disp"] <- NA
现在,我通过cyl
聚合disp
和mpg
列。首先,我使用数据帧方法:
aggregate(mtcars[, c("mpg", "disp")], list(cyl = mtcars$cyl), mean)
## cyl mpg disp
## 1 4 26.66364 105.1364
## 2 6 19.74286 183.3143
## 3 8 15.10000 NA
显然,NA
的值没有被省略。然而,mean()
带有一个参数na.rm
,我可以将其设置为TRUE
,如下所示:
aggregate(mtcars[, c("mpg","disp")], list(cyl = mtcars$cyl), mean, na.rm = TRUE)
## cyl mpg disp
## 1 4 26.66364 105.1364
## 2 6 19.74286 183.3143
## 3 8 15.10000 352.5692
(这个工作的原因也可以在aggregate()
的文档中找到。该函数有一个参数...
(与许多R函数一样),它将匹配您传递给该函数的所有不匹配其参数的表达式。然后将这些表达式传递给用于聚合的函数。由于aggregate()
没有名为na.rm
的参数,因此该参数将被发送给mean()
。
现在回到引起您困惑的原因:您也可以通过将公式作为第一个参数来使用聚合(我发现更可读,因此更可取)。调用的内容如下:
aggregate(cbind(mpg, disp) ~ cyl, data = mtcars, mean)
## cyl mpg disp
## 1 4 26.66364 105.1364
## 2 6 19.74286 183.3143
## 3 8 14.82308 352.5692
可以看到,在这种形式下,NA
值在默认情况下确实被省略了。