Проблема здесь в том, что применяемая вами функция не работает с фреймом данных. По сути, вы вызываете что-то вроде этого
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
; это намного лучше, чем attaching()
iris
, если вы не хотите индексировать через iris$Species
.
person
Gavin Simpson
schedule
13.01.2014
iris[1:4]
не фактор.iris$Species
- фактор, но тогда это то, чего хочетINDICES
аргумент (или один из вариантов). - person Gavin Simpson   schedule 13.01.2014