如何将函数应用于r中的列子集?

时间:2012-03-01 16:25:27

标签: r

我正在使用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

如何在选择一系列列时实现此行为?

2 个答案:

答案 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.