這裏的問題是,該功能你申請不適用於數據框。實際上要調用這樣的事情
R> mean(iris[iris$Species == "setosa", 1:4])
[1] NA
Warning message:
In mean.default(iris[iris$Species == "setosa", 1:4]) :
argument is not numeric or logical: returning NA
即要傳遞4列的數據幀,包含原始其中Species == "setosa"
的行。
對於by()
你需要做的變量此變量,如
R> by(iris[,1] , iris$Species , mean)
iris$Species: setosa
[1] 5.006
------------------------------------------------------------
iris$Species: versicolor
[1] 5.936
------------------------------------------------------------
iris$Species: virginica
[1] 6.588
或者使用colMeans()
代替mean()
所施加的FUN
R> by(iris[,1:4] , iris$Species , colMeans)
iris$Species: setosa
Sepal.Length Sepal.Width Petal.Length Petal.Width
5.006 3.428 1.462 0.246
------------------------------------------------------------
iris$Species: versicolor
Sepal.Length Sepal.Width Petal.Length Petal.Width
5.936 2.770 4.260 1.326
------------------------------------------------------------
iris$Species: virginica
Sepal.Length Sepal.Width Petal.Length Petal.Width
6.588 2.974 5.552 2.026
如果像colMeans()
罐頭功能不存在,那麼你總是可以寫一個包裝,至sapply()
例如
foo <- function(x, ...) sapply(x, mean, ...)
by(iris[, 1:4], iris$Species, foo)
R> by(iris[, 1:4], iris$Species, foo)
iris$Species: setosa
Sepal.Length Sepal.Width Petal.Length Petal.Width
5.006 3.428 1.462 0.246
------------------------------------------------------------
iris$Species: versicolor
Sepal.Length Sepal.Width Petal.Length Petal.Width
5.936 2.770 4.260 1.326
------------------------------------------------------------
iris$Species: virginica
Sepal.Length Sepal.Width Petal.Length Petal.Width
6.588 2.974 5.552 2.026
您可能會發現aggregate()
更具吸引力:
R> with(iris, aggregate(iris[,1:4], list(Species = Species), FUN = mean))
Species Sepal.Length Sepal.Width Petal.Length Petal.Width
1 setosa 5.006 3.428 1.462 0.246
2 versicolor 5.936 2.770 4.260 1.326
3 virginica 6.588 2.974 5.552 2.026
通知我如何使用with()
直接訪問Species
;如果你不想通過iris$Species
索引,這比attaching()
iris
好得多。
@Momo'虹膜[ 1:4]'*不是一個因素。 'iris $ Species' *是一個因素,但這就是'INDICES'參數想要的(或者是其中一個選項)。 –