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

5

我正在努力熟悉构成R的广阔宇宙。有一个名为by()的优秀函数似乎正是我所需要的,但它似乎不喜欢在数据框中选择多个列。

我使用了标准的鸢尾花数据集,当只选择单个列时,它似乎表现良好,但选择多个列时就不行了。这个例子来自一本参考书,但当然可能存在打字错误。

第一个版本(这个可以工作)

> 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个回答

9
你收到的消息与by 函数无关,而是与 mean 函数有关。你传递了一个data.frame, 而 mean 函数期望的是一个向量。
如果你使用可以处理 data.frame 的函数,那么就不会出现警告:
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函数:

请注意,如果您尝试在任何数据框上调用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 ;)



网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接