我正在努力熟悉构成R的浩瀚宇宙。()有一个很好的功能,似乎只是我需要的东西,但它似乎不喜欢在数据框中选择多个列。
我使用了标准的虹膜数据集,虽然它看起来很好,只选择了一个列,但它似乎不喜欢选择多个列。该示例来自参考书,但当然可能存在拼写错误。
第一个版本(可行)
> by(iris[,2],Species,mean)
Species: setosa
[1] 3.428
------------------------------------------------------------
Species: versicolor
[1] 2.77
------------------------------------------------------------
Species: virginica
[1] 2.974
第二个版本(这不是)
> by(iris[,2:3],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], ...) :
感激地收到任何解释。
答案 0 :(得分:9)
您收到的消息与by
功能无关,而是与mean
有关
当data.frame
期待向量时,您传递了mean
。
如果您使用的函数适用于data.frame
s,则不会抛出任何警告:
by(iris[,2:3],iris$Species, colMeans)
by(iris[,2:3],iris$Species, print)
etc
如果需要,您可以嵌套*ply
类型函数(例如by
,tapply
,lapply
等)。
试试这个例子:
by(iris[,2:3],iris$Species,lapply, mean)
mean
:请注意,如果您尝试在任何data.frame上调用mean
,它会抱怨:
mean(iris[,2:3])
mean(iris[iris$Species==iris$Species[[1]] ,2:3])
使用colMeans
代替
colMeans(iris[iris$Species==iris$Species[[1]] ,2:3])
关于不相关的说明:避免使用attach
;)