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