"平均"在"内"在R中投掷警告

时间:2014-01-20 11:57:16

标签: r

我试图按照以下方式使用功能获得分组意义:

by(iris[,1:4],iris$Species,mean)

但我收到警告:

iris$Species: setosa
[1] NA
----------------------------------------------------------------------------------------------------------------------------- 
iris$Species: versicolor
[1] NA
----------------------------------------------------------------------------------------------------------------------------- 
iris$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

但是以下所有命令都运行正常,我想知道为什么如果我在 by 函数中提供iris[,1:4]作为第一个参数,则意味着无法正常工作。

 by(iris[,1:4],iris$Species,summary)
 by(iris[,1],iris$Species,mean)
 aggregate(iris[,1:4],list(iris$Species),mean)

在谷歌之后,我发现了这个link,似乎by(iris[,1:4],iris$Species,mean)命令应该有用。

我无法找到我犯错误的地方。任何人的帮助都非常感谢。

我正在使用内置 iris 数据进行演示。

R版本 - 在Windows上为3.0.2(32位)

谢谢

2 个答案:

答案 0 :(得分:4)

如果要计算列的平均值,则必须使用colMeans

> by(iris[1:4], iris$Species, colMeans)

iris$Species: setosa
Sepal.Length  Sepal.Width Petal.Length  Petal.Width 
       5.006        3.428        1.462        0.246 
-------------------------------------------------------------------------------- 
iris$Species: versicolor
Sepal.Length  Sepal.Width Petal.Length  Petal.Width 
       5.936        2.770        4.260        1.326 
-------------------------------------------------------------------------------- 
iris$Species: virginica
Sepal.Length  Sepal.Width Petal.Length  Petal.Width 
       6.588        2.974        5.552        2.026 

更新

顺便说一下:如果您使用mean代替aggregate,则可以使用by

> aggregate(iris[1:4], list(iris$Species), mean)

     Group.1 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

答案 1 :(得分:2)

你想要的东西似乎是合理的:

> sapply(iris[,1:4],by,iris$Species,mean)
           Sepal.Length Sepal.Width Petal.Length Petal.Width
setosa            5.006       3.428        1.462       0.246
versicolor        5.936       2.770        4.260       1.326
virginica         6.588       2.974        5.552       2.026

或者:

> lapply(iris[,1:4],by,iris$Species,mean)
$Sepal.Length
iris$Species: setosa
[1] 5.006
------------------------------------------------------------ 
iris$Species: versicolor
[1] 5.936
------------------------------------------------------------ 
iris$Species: virginica
[1] 6.588

$Sepal.Width
iris$Species: setosa
[1] 3.428
------------------------------------------------------------ 
iris$Species: versicolor
[1] 2.77
------------------------------------------------------------ 
iris$Species: virginica
[1] 2.974

$Petal.Length
iris$Species: setosa
[1] 1.462
------------------------------------------------------------ 
iris$Species: versicolor
[1] 4.26
------------------------------------------------------------ 
iris$Species: virginica
[1] 5.552

$Petal.Width
iris$Species: setosa
[1] 0.246
------------------------------------------------------------ 
iris$Species: versicolor
[1] 1.326
------------------------------------------------------------ 
iris$Species: virginica
[1] 2.026