Estoy usando by
para aplicar una función a un rango columnas de un marco de datos basado en un factor. Todo funciona perfectamente bien si uso mean()
como la función pero si uso median()
me sale un error del tipo "Error en median.default (x): necesito datos numéricos" incluso si no tengo NA en los datos marco.Cómo aplicar una función a un subconjunto de columnas en r?
La línea que funciona mediante 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.
Pero si uso median()
(nótese el 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
Sin embargo, si en lugar de elegir la gama [,1:3]
de columnas que elegir sólo una de las columnas que funciona:
> 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
¿Cómo puedo lograr este comportamiento al seleccionar un rango de columnas?
Los mensajes de advertencia se obtiene cuando se use 'mean' debería ser una buena pista de que, de hecho, todo no funciona" bien ". Esta reciente [respuesta] (http://stackoverflow.com/a/9424510/324364) mía podría arrojar algo de luz sobre esto para usted. – joran