使用用户定义的函数在R中聚合数据

我使用聚合方法将数据分组到R中.
Avg=aggregate(x$a,by=list(x$b,x$c),FUN= mean)

这给出了’a’的所有值的平均值’a’由数据框’x’的’b’和’c’分组.

现在,我不想取’a’的所有值的平均值,而是取“b”和“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

但我想把平均值的最大5个’a’值

Group.1    Group.2    x
  G          3       22.40

我无法容纳我在Agrregate函数中使用的以下最大函数

index <- order(vector,decreasing = T)[1:5]
vector(index)

可以请任何人对这怎么可能有所了解?

您可以订购数据,获取前5个条目(使用head),然后应用均值:
aggregate(x$a,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,FUN= function(z) myfunc(z,5))
#  Group.1 Group.2    x
#1       G       3 22.4

我实际上更喜欢使用聚合中的公式样式,看起来像这样(我也使用with()来直接引用列名,而不是每次都使用x $):

with(x,aggregate(a ~ b + c,5)))
#  b c    a
#1 G 3 22.4

在该函数中,参数z基于b和c的组传递每个a-向量.那现在更有意义了吗?另请注意,此处不返回整数,而是返回数值(十进制,在本例中为22.4)值.

相关文章

适配器模式将一个类的接口转换成客户期望的另一个接口,使得原本接口不兼容的类可以相互合作。
策略模式定义了一系列算法族,并封装在类中,它们之间可以互相替换,此模式让算法的变化独立于使用算法...
设计模式讲的是如何编写可扩展、可维护、可读的高质量代码,它是针对软件开发中经常遇到的一些设计问题...
模板方法模式在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中,使得子类可以在不改变算法结...
迭代器模式提供了一种方法,用于遍历集合对象中的元素,而又不暴露其内部的细节。
外观模式又叫门面模式,它提供了一个统一的(高层)接口,用来访问子系统中的一群接口,使得子系统更容...