如何汇总结果?
x=iris[,1:4]
transform(x,"sum"=apply(x,MARGIN=1,FUN=sum))
输出是:
Sepal.Length Sepal.Width Petal.Length Petal.Width sum
1 5.1 3.5 1.4 0.2 10.2
2 4.9 3.0 1.4 0.2 9.5
3 4.7 3.2 1.3 0.2 9.4
4 4.6 3.1 1.5 0.2 9.4
(省略了很多行),我只想更好地了解聚合,也许很难得到与聚合函数相同的结果。
答案 0 :(得分:2)
您的问题似乎与我希望遵循的代码有所不同。 aggregate
旨在"适用"列的特定功能,但仅限于由" by"划分的类别。论点。它旨在"在特定类别中聚合。
apply
(其第二个参数设置为2而不是代码中的1)将在整个列上使用函数。没有分组变量。编码器在不同含义和导入的向量上逐行运行,因此它返回每个人的四个不同测量值的各个总和,除非已经建立了一些准备或基础工作,否则这个过程可能毫无意义。
如果您想以类似于聚合的方式使用apply,请查看以下内容:
> sapply( split(iris[,1:4], iris[, 5]), apply, 2, sum)
setosa versicolor virginica
Sepal.Length 250.3 296.8 329.4
Sepal.Width 171.4 138.5 148.7
Petal.Length 73.1 213.0 277.6
Petal.Width 12.3 66.3 101.3
> aggregate(iris[ ,1: 4], iris[5], FUN=sum)
Species Sepal.Length Sepal.Width Petal.Length Petal.Width
1 setosa 250.3 171.4 73.1 12.3
2 versicolor 296.8 138.5 213.0 66.3
3 virginica 329.4 148.7 277.6 101.3
如果你的目标不是进行任何类别计算,你会传递一个与数据帧行数相同长度的列表:
> aggregate(iris[ ,1: 4], list(rep(1,nrow(iris))), FUN=sum)
Group.1 Sepal.Length Sepal.Width Petal.Length Petal.Width
1 1 876.5 458.6 563.7 179.9
> apply(iris[1:4], 2, sum)
Sepal.Length Sepal.Width Petal.Length Petal.Width
876.5 458.6 563.7 179.9
答案 1 :(得分:0)
如果Rubens是正确的,并且您想使用apply
而不是aggregate
,并且您对今天发布的aggregate
表达式感兴趣,那么您可以使用{ {1}}。
What is the meaning of ~ in aggregate?
tapply
已修改为添加x=iris[,1:4]
names(x)<-c("x1","x2","x3","x4")
aggregate(x1+x2+x3+x4~x1,FUN=sum,data=x)
tapply((x$x1 + x$x2 + x$x3 + x$x4), x$x1, sum)
和sapply
修改自DWin的答案,以提供与lapply
相同的答案,
紧随其上方的tapply
,以及aggregate
,rapply
以及重新格式化的vapply
和tapply
函数:
by
我还没想出如何用with(x, sapply(split((x1 + x2 + x3 + x4), x1), sum))
with(x, lapply(split((x1 + x2 + x3 + x4), x1), sum))
with(x, rapply(split((x1 + x2 + x3 + x4), x1), sum))
with(x, tapply( (x1 + x2 + x3 + x4), x1 , sum))
with(x, vapply(split((x1 + x2 + x3 + x4), x1), sum, FUN.VALUE=1))
with(x, by((x1 + x2 + x3 + x4), x1, sum))
得到相同的答案。嗯,这是一种方式,但它非常愚蠢:
mapply
最后,这里有一种方法可以使用tapply(mapply(sum, x$x1 , x$x2 , x$x3 , x$x4), x$x1, sum)
(在apply
内)获得与上述其他行相同的答案:
tapply
最后一件事,如果您确实希望tapply(apply((x[,1:4]),1,sum),x$x1,sum)
能够在帖子中返回与aggregate
语句相同的答案,那么这是可能的。但是,您所做的只是使用apply
语句将每一行汇总。因此,您必须“欺骗”apply
认为Iris数据集中的每一行都有一个单独的组,如下所示:
aggregate