R 在聚合函数中,创建函数和数据帧子集不起作用
我遇到了一个奇怪的问题,如果我在自定义函数中调用聚合函数,它的行为会很奇怪。它似乎完全凌驾于子集函数之上:R 在聚合函数中,创建函数和数据帧子集不起作用,r,aggregate,subset,custom-function,R,Aggregate,Subset,Custom Function,我遇到了一个奇怪的问题,如果我在自定义函数中调用聚合函数,它的行为会很奇怪。它似乎完全凌驾于子集函数之上: 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 <- rt
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)
为了给你问题的要点,我将把它分为两部分。
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)
这正是它应该的样子
但是
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)
现在我想知道为什么它在聚合函数中得到“truck”?
虽然在聚合函数中,我使用了数据datam_子集,它是一个子集,只包含“carr”和“bike”上的数据
可能是我遗漏了一些非常基本的东西。我将感谢你的帮助。谢谢,这是因为聚合函数是从两个data.frames调用的 这:
dg1这是因为聚合函数是从两个data.frames调用的
这:
dg1实际上有两个问题。首先,您正在对c
进行子集设置,而不是像其他人指出的那样对datam
进行子集设置,但这同样不能解决问题datam\u子集
没有名为lb,ld,inc\u call的列
。因此,您的函数应该如下所示:
rtk <- function(datam, inc_coll, inc_vall, lb, ld){
datam_subset <- subset(datam, inc_coll %in% inc_vall)
names(datam_subset)<- c("inc_coll", "lb", "ld")
dg1<- aggregate(lb ~ ld + inc_coll,datam_subset,max)
return(dg1)
}
> c_ans <- rtk(c,c$A,c("carr","bike"),c$B, c$D)
> c_ans
ld inc_coll lb
1 2 bike 78
2 3 bike 56
3 1 carr 23
4 3 carr 44
rtk实际上有两个问题。首先,您正在对c
进行子集设置,而不是像其他人指出的那样对datam
进行子集设置,但这同样不能解决问题datam\u子集
没有名为lb,ld,inc\u call的列
。因此,您的函数应该如下所示:
rtk <- function(datam, inc_coll, inc_vall, lb, ld){
datam_subset <- subset(datam, inc_coll %in% inc_vall)
names(datam_subset)<- c("inc_coll", "lb", "ld")
dg1<- aggregate(lb ~ ld + inc_coll,datam_subset,max)
return(dg1)
}
> c_ans <- rtk(c,c$A,c("carr","bike"),c$B, c$D)
> c_ans
ld inc_coll lb
1 2 bike 78
2 3 bike 56
3 1 carr 23
4 3 carr 44
rtk将列名传递给函数是一个经常被问到的问题,因为这可能违反直觉。检查此问题:
编写函数的更好方法是将列名(而不是列本身)传递给rtk,然后将它们用于您想要执行的操作:
rtk <- function(datam,inc_coll,inc_vall,lb,ld){
## Access the column using df[[colname]] to do the subset
datam_subset <- subset(c,c[[inc_coll]] %in% inc_vall);
## Define the formula you will use in the aggregate function
f=as.formula(paste0(lb,"~",ld,"+", inc_coll))
## Perform the aggregation
dg1<- aggregate(f,datam_subset,max);
return(dg1)
}
将列名传递给函数是一个经常被问到的问题,因为这可能违反直觉。检查此问题:
编写函数的更好方法是将列名(而不是列本身)传递给rtk,然后将它们用于您想要执行的操作:
rtk <- function(datam,inc_coll,inc_vall,lb,ld){
## Access the column using df[[colname]] to do the subset
datam_subset <- subset(c,c[[inc_coll]] %in% inc_vall);
## Define the formula you will use in the aggregate function
f=as.formula(paste0(lb,"~",ld,"+", inc_coll))
## Perform the aggregation
dg1<- aggregate(f,datam_subset,max);
return(dg1)
}
您将原始数据帧的实际列作为函数rtk
的输入,而不仅仅是列名。因此,子集
起作用,但是,聚合
是在c
的列上完成的,因为没有人真正提到过它。给出了在函数中使用子集的一些想法。此外,aggregate还有一个subset参数,它可能会使easierdatam param永远不会在函数中使用,尽管您将c
传递给它,作为您的函数rtk
的输入,原始数据框的实际列而不仅仅是列名。因此,子集
起作用,但是,聚合
是在c
的列上完成的,因为没有人真正提到过它。给出了在函数中使用子集的一些想法。此外,aggregate还有一个subset参数,这可能使函数中永远不会使用easierdatam param,尽管您将c
传递给itThanks Lamia以详细解释它@Yannis解决方案也可以,但您的解决方案更具可配置性。感谢Lamia的详细解释@Yannis解决方案也可以工作,但您的解决方案更具可配置性。
rtk <- function(datam,inc_coll,inc_vall,lb,ld){
## Access the column using df[[colname]] to do the subset
datam_subset <- subset(c,c[[inc_coll]] %in% inc_vall);
## Define the formula you will use in the aggregate function
f=as.formula(paste0(lb,"~",ld,"+", inc_coll))
## Perform the aggregation
dg1<- aggregate(f,datam_subset,max);
return(dg1)
}
c_ans <- rtk(c,"A",c("carr","bike"),"B","D")
D A B
1 2 bike 78
2 3 bike 56
3 1 carr 23
4 3 carr 44