5

我正在尝试熟悉构成 R 的浩瀚宇宙。 by() 有一个出色的函数,它似乎可以满足我的需要,但它似乎不喜欢在数据框中选择多个列。

我使用了标准的 iris 数据集,虽然它在选择单列时表现良好,但似乎不喜欢选择多列。该示例取自参考书,但当然可能存在拼写错误。

第一个版本(有效)

> 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], ...) :

任何解释都非常感激。

4

1 回答 1

9

您收到的消息与功能无关,by而是与mean. 您在期望向量 时
传递了它。data.framemean

相反,如果您要使用在data.frames 上工作的函数,则不会引发警告:

by(iris[,2:3],iris$Species, colMeans)
by(iris[,2:3],iris$Species, print)
etc

如果需要,您可以嵌套*ply类型函数(例如by,、、tapplylapply)。试试这个例如:

by(iris[,2:3],iris$Species,lapply, mean)

至于mean

请注意,如果您尝试调用mean任何 data.frame,它会抱怨:

mean(iris[,2:3])
mean(iris[iris$Species==iris$Species[[1]] ,2:3])

colMeans改为使用

colMeans(iris[iris$Species==iris$Species[[1]] ,2:3])

在一个不相关的说明:避免使用attach ;)

于 2013-10-11T19:08:50.547 回答