R 3.0.0中by()函数的奇怪行为?

Cha*_*wer 5 r

我正在努力熟悉构成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)

感激地收到任何解释.

Ric*_*rta 9

您获得的消息与by功能无关,而是与之相关mean.当
你期待一个向量data.frame时,你传递了它mean.

相反,如果您使用的是一个在data.frames 上工作的函数,则不会抛出任何警告:

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 ;)