创建函数和数据框的子集在聚合函数中不起作用
creating a function and subset of data frame is not working in aggregate function
我遇到了一个奇怪的问题,如果我在自定义函数中调用聚合函数,它会表现得很奇怪。它似乎完全超过了子集函数:
为了让您了解问题的要点,我将把它分成两部分。
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
现在我想知道为什么它在聚合函数中得到"truck"?
尽管在聚合函数中我使用的数据 datam_subset 是一个子集并且仅包含 "carr" 和 "bike".
上的数据
可能是我遗漏了一些非常基本的东西。将感谢您的帮助。谢谢
这是因为你的聚合函数是从两个调用的data.frames
这个:
dg1<- aggregate(lb ~ ld + inc_coll, datam_subset, max)
实际读起来像:
dg1<- aggregate(c$B ~ c$D + c$A, datam_subset, max)
因此您将覆盖 datam_subset 调用并简单地调用 c
.
实际上有2个问题。首先,正如其他人所指出的那样,您是 c
而不是 datam
的子集,但这同样不能解决问题。 datam_subset
没有名为 lb, ld, inc_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
您可以通过 colnames(c_ans)<- c("D", "A", "B")
将名称更改为 c_ans
将列名传递给函数是一个经常被问到的问题,因为它可能违反直觉。检查这个问题:Pass a data.frame column name to a function
编写函数的更好方法是将列名而不是列本身传递给 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)
}
然后使用列名适当地调用它:
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
我遇到了一个奇怪的问题,如果我在自定义函数中调用聚合函数,它会表现得很奇怪。它似乎完全超过了子集函数:
为了让您了解问题的要点,我将把它分成两部分。 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
现在我想知道为什么它在聚合函数中得到"truck"? 尽管在聚合函数中我使用的数据 datam_subset 是一个子集并且仅包含 "carr" 和 "bike".
上的数据可能是我遗漏了一些非常基本的东西。将感谢您的帮助。谢谢
这是因为你的聚合函数是从两个调用的data.frames
这个:
dg1<- aggregate(lb ~ ld + inc_coll, datam_subset, max)
实际读起来像:
dg1<- aggregate(c$B ~ c$D + c$A, datam_subset, max)
因此您将覆盖 datam_subset 调用并简单地调用 c
.
实际上有2个问题。首先,正如其他人所指出的那样,您是 c
而不是 datam
的子集,但这同样不能解决问题。 datam_subset
没有名为 lb, ld, inc_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
您可以通过 colnames(c_ans)<- c("D", "A", "B")
c_ans
将列名传递给函数是一个经常被问到的问题,因为它可能违反直觉。检查这个问题:Pass a data.frame column name to a function 编写函数的更好方法是将列名而不是列本身传递给 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)
}
然后使用列名适当地调用它:
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