Я использую by
для применения функции к столбцам диапазона фрейма данных на основе фактора. Все отлично работает, если я использую mean()
в качестве функции, но если я использую median()
, я получаю ошибку типа «Ошибка в median.default (x): нужны числовые данные» , даже если я нет данных в фрейме данных.
Строка, которая работает с использованием mean()
:
by(iris[,1:3], iris$Species, function(x) mean(x,na.rm=T))
> by(iris[,1:3], iris$Species, function(x) mean(x,na.rm=T))
iris$Species: setosa
Sepal.Length Sepal.Width Petal.Length
5.006 3.428 1.462
------------------------------------------------------------
iris$Species: versicolor
Sepal.Length Sepal.Width Petal.Length
5.936 2.770 4.260
------------------------------------------------------------
iris$Species: virginica
Sepal.Length Sepal.Width Petal.Length
6.588 2.974 5.552
Warning messages:
1: mean(<data.frame>) is deprecated.
Use colMeans() or sapply(*, mean) instead.
2: mean(<data.frame>) is deprecated.
Use colMeans() or sapply(*, mean) instead.
3: mean(<data.frame>) is deprecated.
Use colMeans() or sapply(*, mean) instead.
Но если я использую median()
(обратите внимание на na.rm=T option
):
> by(iris[,1:3], iris$Species, function(x) median(x,na.rm=T))
Error in median.default(x, na.rm = T) : need numeric data
Однако, если вместо выбора диапазона [,1:3]
столбцов я выберу только один из столбцов, он работает:
> by(iris[,1], iris$Species, function(x) median(x,na.rm=T))
iris$Species: setosa
[1] 5
------------------------------------------------------------
iris$Species: versicolor
[1] 5.9
------------------------------------------------------------
iris$Species: virginica
[1] 6.5
Как мне добиться такого поведения при выборе диапазона столбцов?