Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 在聚合函数中,创建函数和数据帧子集不起作用_R_Aggregate_Subset_Custom Function - Fatal编程技术网

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