如何将函数应用于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