用自定义函数在R中聚合数据

8

我使用聚合方法在R中对数据进行了分组。

Avg=aggregate(x$a, by=list(x$b,x$c),FUN= mean)

这个代码给出了数据框'x'中按照'b'和'c'分组的所有'a'值的平均值。

现在,我想要计算按照'b'和'c'分组的'a'值的最大的三个值的平均值,而不是所有'a'值的平均值。

数据集示例:

a    b    c
10   G    3 
20   G    3 
22   G    3
10   G    3 
15   G    3
25   G    3
30   G    3

在上述聚合函数之后,它将给我一个结果。
Group.1    Group.2    x
  G          3       18.85

但是我只想取前5个数,计算平均值。

Group.1    Group.2    x
  G          3       22.40

我无法容纳我在聚合函数中使用的以下最大函数。
index <- order(vector, decreasing = T)[1:5]
vector(index)

请问有人能解释一下这是如何实现的吗?
1个回答

7
您可以对数据进行排序,获取前5个条目(使用head),然后应用平均值:
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基于bc的组对每个a-向量进行传递。现在是不是更容易理解了?还要注意的是,它不返回整数,而是一个数字(在本例中为小数22.4)。

函数和头文件中使用的 'x' 是哪个 'x'? - user3812709
哦,那个名字选得不好。尝试用 ..function(z) myfunc(z, 5)) 替换函数的最后一部分,这样可以吗?我现在不在电脑旁。 - talat
所以函数中的第一个参数将是向量,而在我的情况下将是“x$a”,对吗?如果是的话,它显示了一个错误,即参数1不是向量。谢谢。 - user3812709
@user3812709,您是否仍然收到错误消息?它已经可以使用样本数据。如果您仍然遇到某些错误,请尝试提供导致错误的数据示例。 - talat
现在对我有效。谢谢。只是想确认一下,从上面的示例数据来看,函数的第一个参数将是“x$a”,对吗? - user3812709
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接