【发布时间】:2017-05-14 21:28:53
【问题描述】:
我遇到了一个奇怪的问题,如果我在自定义函数中调用聚合函数,它的行为就会很奇怪。它似乎完全超过了子集函数:
为了让您了解问题所在,我将其分为两部分。 1.没有自定义功能
c<- data.frame(A = c("carr","bike","truck","carr","truck","bike","bike","carr","truck","carr","truck","truck","carr","truck","truck"),
B = c(10,20,30,23,45,56,78,44,10,20,30,10,20,30,67),
D = c(1,2,3,1,2,3,2,3,2,3,2,2,3,2,1))
c_subset<- subset(c,(A=="carr")|(A=="bike"))
dg<- aggregate(B ~ D + A ,c_subset,max)
dg 的值为:
D A B
2 bike 78
3 bike 56
1 carr 23
3 carr 44
这正是它应该的样子。
但是 2.带自定义功能:
rtk <- function(datam,inc_coll,inc_vall,lb,ld){
datam_subset <- subset(c,inc_coll %in% inc_vall)
dg1<- aggregate(lb ~ ld + inc_coll,datam_subset,max)
return(dg1)
}
c_ans <- rtk(c,c$A,c("carr","bike"),c$B,c$D)
答案是:
ld inc_coll lb
2 bike 78
3 bike 56
1 carr 23
3 carr 44
1 truck 67
2 truck 45
3 truck 30
现在我想知道为什么它在聚合函数中得到“卡车”? 虽然在聚合函数中我使用了数据 datam_subset,它是一个子集,只包含“carr”和“bike”的数据。
可能是我遗漏了一些非常基本的东西。应感谢您的帮助。谢谢
【问题讨论】:
-
您为函数
rtk提供原始数据框的实际列,而不仅仅是列名。所以subset有效,但随后aggregate在c的列上完成。 -
因为没有人真正提到它。 stackoverflow.com/questions/9860090/why-is-better-than-subset 给出了在函数中使用子集的一些想法。聚合还有一个子集参数,这可能会使事情变得更容易
-
datam 参数永远不会在函数内部使用,尽管您将
c传递给它
标签: r aggregate subset custom-function