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

时间:2013-10-11 19:03:03

标签: r

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

感激地收到任何解释。

1 个答案:

答案 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类型函数(例如bytapplylapply等)。 试试这个例子:

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