我正在使用by
根据因素将函数应用于数据框的范围列。如果我使用mean()
作为函数,一切都运行得很好但是如果我使用median()
我得到类型错误“middle.default(x)中的错误:需要数字数据”即使我在数据框中没有NA。
使用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
如何在选择一系列列时实现此行为?
答案 0 :(得分:4)
使用by
时,您正在使用拆分应用策略。传递给函数的对象是数据框,由于median.data.frame
不存在以及mean.data.frame
即将不存在,您将收到警告和错误。如果您使用aggregate
:
> aggregate(iris[,1:3], iris["Species"], function(x) mean(x,na.rm=T))
Species Sepal.Length Sepal.Width Petal.Length
1 setosa 5.006 3.428 1.462
2 versicolor 5.936 2.770 4.260
3 virginica 6.588 2.974 5.552
> aggregate(iris[,1:3], iris["Species"], function(x) median(x,na.rm=T))
Species Sepal.Length Sepal.Width Petal.Length
1 setosa 5.0 3.4 1.50
2 versicolor 5.9 2.8 4.35
3 virginica 6.5 3.0 5.55
aggregate
分别处理列向量,然后将结果制成表格。
答案 1 :(得分:1)
回答原始问题。但是,如果范围恰好是(相反)除了在公式中指定为自变量的列之外的所有列,则点公式表示法起作用,并且表示一个漂亮的替代方案:
{
if (my_flag) {
// etc.