我使用聚合方法将数据分组到R中。
Avg=aggregate(x$a, by=list(x$b,x$c),FUN= mean)
这给出了'a'的所有值的平均值'a'由数据框'x'的'b'和'c'分组。
现在不是取'a'的所有值的平均值,而是想取'a'和'c'分组的'a'的3个最大值的平均值。
样本数据集
a b c
10 G 3
20 G 3
22 G 3
10 G 3
15 G 3
25 G 3
30 G 3
在上面的Aggregate函数之后,它会给我
Group.1 Group.2 x
G 3 18.85
但是我想把“a”的最大5个值用于平均值
Group.1 Group.2 x
G 3 22.40
我无法容纳我在Agrregate功能中使用的以下最大功能
index <- order(vector, decreasing = T)[1:5]
vector(index)
可以请任何人对这怎么可能有所了解?
答案 0 :(得分:6)
您可以订购数据,获取前5个条目(使用头部),然后应用平均值:
aggregate(x$a, by=list(x$b,x$c),FUN= function(x) mean(head(x[order(-x)], 5)))
# Group.1 Group.2 x
#1 G 3 22.4
如果您想使用自定义函数执行此操作,我会这样做:
myfunc <- function(vec, n){
mean(head(vec[order(-vec)], n))
}
aggregate(x$a, by=list(x$b,x$c),FUN= function(z) myfunc(z, 5))
# Group.1 Group.2 x
#1 G 3 22.4
我实际上更喜欢使用aggregate
中的公式样式(我也使用with()
来直接引用列名,而不是每次都使用x$
) :
with(x, aggregate(a ~ b + c, FUN= function(z) myfunc(z, 5)))
# b c a
#1 G 3 22.4
在此函数中,参数z
将根据a
和b
的每个c
- 向量传递。那现在更有意义了吗?另请注意,此处不返回整数,而是返回数值(十进制,本例中为22.4)值。