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

如何将函数应用于r中的列子集?,r,R,我使用by将函数应用于基于系数的数据帧的范围列。如果我使用mean()作为函数,那么一切都会很好地工作,但是如果我使用median()我会得到一个类型为“error in median.default(x):need numeric data”的错误,即使我的数据框中没有NAs 使用mean()的行: 但是,如果我没有选择列的范围[,1:3],而是只选择其中一列: > by(iris[,1], iris$Species, function(x) median(x,na.rm=T)) iri

我使用
by
将函数应用于基于系数的数据帧的范围列。如果我使用
mean()
作为函数,那么一切都会很好地工作,但是如果我使用
median()
我会得到一个类型为“error in median.default(x):need numeric data”的错误,即使我的数据框中没有NAs

使用
mean()
的行:

但是,如果我没有选择列的范围
[,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

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

当您使用
by
时,您正在使用拆分应用策略。传递给函数的对象是dataframes,由于不存在
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
分别处理列向量,然后将结果制成表格。

原始问题已得到回答。但是,如果范围恰好是(相反)除公式中指定为自变量的列以外的所有列,则点公式表示法有效,并代表了一个漂亮的替代方案:

> aggregate(. ~ Species, data = iris, 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

> aggregate(. ~ Species, data = iris, median)
     Species Sepal.Length Sepal.Width Petal.Length Petal.Width
1     setosa          5.0         3.4         1.50         0.2
2 versicolor          5.9         2.8         4.35         1.3
3  virginica          6.5         3.0         5.55         2.0

当你使用
时,你得到的警告信息意味着
应该是一个强有力的线索,事实上,一切都不是“很好”的。我最近的这篇文章可能会给你一些启示。谢谢。现在可以了。我现在怀疑:
聚合(iris[,1:3]、iris[“物种]、函数(x)中值(x,na.rm=T))
聚合(iris[,1:3]、iris$物种、函数(x)中值(x,na.rm=T))
。第二个返回聚合的错误。data.frame(iris[,1:3],iris$Species,function(x)median(x,:'by'必须是一个列表)
@pedrosaurio错误消息说明了一切。
iris[“Species”]
是一个列表(实际上是一个数据帧),而
iris$Species
不是。您可以使用
str()验证这一点
。我想添加一个注释,说明您使用的是
$Species
,它相当于
[[“Species”]]
返回一个原子向量,我使用的是
[“Species”]
返回一个列表。我想我应该这样做。
> 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(. ~ Species, data = iris, 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

> aggregate(. ~ Species, data = iris, median)
     Species Sepal.Length Sepal.Width Petal.Length Petal.Width
1     setosa          5.0         3.4         1.50         0.2
2 versicolor          5.9         2.8         4.35         1.3
3  virginica          6.5         3.0         5.55         2.0