我试图按照以下方式使用按功能获得分组意义:
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位)
谢谢
答案 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