为什么by()函数不能按照本博文中描述的方式工作

时间:2014-02-27 09:06:28

标签: r

我正在尝试重现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序列。如果我只指定一列,它给我的方法没有问题。我不知道为什么当给出多个列时它会吐出它的假人。有什么建议吗?

3 个答案:

答案 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()测试。