我正在尝试重现this blog post中给出的by()函数的分析。当我将代码粘贴到R中时,我得到一条错误消息,而不是博客文章中汇总的虹膜数据的好表。
attach(iris)
head(iris)
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1 5.1 3.5 1.4 0.2 setosa
2 4.9 3.0 1.4 0.2 setosa
3 4.7 3.2 1.3 0.2 setosa
4 4.6 3.1 1.5 0.2 setosa
5 5.0 3.6 1.4 0.2 setosa
6 5.4 3.9 1.7 0.4 setosa
所以数据框就在那里,一切都很顺利。
粘贴博客中的by()函数会给我这个错误:
by(iris[, 1:4], Species, mean)
Species: setosa
[1] NA
----------------------------------------------------------------------------------
Species: versicolor
[1] NA
----------------------------------------------------------------------------------
Species: virginica
[1] NA
Warning messages:
1: In mean.default(data[x, , drop = FALSE], ...) :
argument is not numeric or logical: returning NA
2: In mean.default(data[x, , drop = FALSE], ...) :
argument is not numeric or logical: returning NA
3: In mean.default(data[x, , drop = FALSE], ...) :
argument is not numeric or logical: returning NA
我真的看不出这里有什么问题。我已经尝试过与其他数据帧等等,问题似乎是数据帧索引中的1:4序列。如果我只指定一列,它给我的方法没有问题。我不知道为什么当给出多个列时它会吐出它的假人。有什么建议吗?
答案 0 :(得分:4)
我不确定,博文的年龄有多大,但如果我查看by
的文档,其功能与博客文章所描述的不同。
by
将输入数据拆分为子网格数据框,但您无法获得mean
数据框!
mean(iris[,1:4])
[1] NA
Warning message:
In mean.default(iris[, 1:4]) :
argument is not numeric or logical: returning NA
如果您希望在一列中获得by
个值,则可以使用mean
by(iris[,1], iris$Species, mean)
iris$Species: setosa
[1] 5.006
---------------------------------------------------------------------------------------------
iris$Species: versicolor
[1] 5.936
---------------------------------------------------------------------------------------------
iris$Species: virginica
[1] 6.588
但要获取所有列的方法,请按@Thomas
的建议使用aggregate
答案 1 :(得分:1)
我不确定那篇博文如何得到答案,因为R对我来说和你一样对我产生同样的效果。请考虑aggregate
:
> aggregate(. ~ Species, iris, mean)
Species Sepal.Length Sepal.Width Petal.Length Petal.Width
1 setosa 5.006 3.428 1.462 0.246
2 versicolor 5.936 2.770 4.260 1.326
3 virginica 6.588 2.974 5.552 2.026
答案 2 :(得分:1)
错误消息告诉您'mean.default'给出错误。如果你想知道为什么mean.default正在做它的作用,你可以看一下来源:
> mean.default
function (x, trim = 0, na.rm = FALSE, ...)
{
if (!is.numeric(x) && !is.complex(x) && !is.logical(x)) {
warning("argument is not numeric or logical: returning NA")
return(NA_real_)}
...
'by()'做了它应该做的事,但是“mean()”失败了,因为传递的数据帧没有通过is.numeric()测试。