在函数中正确使用dcast.table.table

时间:2015-03-06 11:06:27

标签: r data.table

如何将dcast.data.table()正确嵌入到函数中?

我想编写一个使用(除此之外)dcast.data.table()命令的函数。该函数应该做的一件事是将data.frame转换为data.table。在那之后,它应该dcast表。

以此数据框为例:

test <-data.frame(lett=c("a", "b", "c", "c", "d", "d", "e"), 
                  group=c(1,1,1,3,3,4,4),
                  perc=sample(1:100,7))
  lett group perc
1    a     1   71
2    b     1   87
3    c     1   36
4    c     3   39
5    d     3    4
6    d     4   20
7    e     4   16
如果没有嵌入到函数中,

dcast.data.table工作正常:

test.dt <- setDT(as.list(test))
dcast.data.table(test.dt, lett~group, var.value="perc")

Using 'perc' as value column. Use 'value.var' to override
   lett  1  3  4
1:    a 71 NA NA
2:    b 87 NA NA
3:    c 36 39 NA
4:    d NA  4 20
5:    e NA NA 16

但是当我在函数中嵌入setDT(as.list())和dcast.data.table时,我收到错误“dcast.data.table中的错误......未找到列'y'。” / p>

myfunction <- function(d, y, z,v) 
                      {d <- setDT(as.list(d))
                      temp <- dcast.data.table(d, y~z, 
                                    value.var=v)
                      return(temp)}

myfunction(test)

任何提示都将不胜感激。

----------------------------------------------- -------------------

我以前的命令有错误(我忘了添加其余的参数)。我打算写这个:

myfunction(test,lett,group,perc)

2 个答案:

答案 0 :(得分:0)

你的函数有问题,需要4个参数,但你只用一个参数调用它。 但是,此功能将起作用。

myfunction <- function(d) {
   d <- setDT(as.list(d))
   formula <- as.formula(paste(names(d)[1],"~",names(d)[2]))
   temp <- dcast.data.table(d, formula ,value.var=names(d)[3])
   return(temp)
}

答案 1 :(得分:0)

我想我找到了解决问题的方法:

myfunction <- function(d=NULL, y,z,v) 
{y<-eval(substitute(y),d, parent.frame())
 z<-eval(substitute(z),d, parent.frame())
 v<-eval(substitute(v),d, parent.frame())
 d.temp <- data.table(y=y,z=z,v=v)
 temp <- dcast.data.table(d.temp, y~z, 
                          value.var="v")
 return(temp)
}
myfunction(test, lett, group, perc)

返回所需的输出:

   y  1  3  4
1: a 14 NA NA
2: b 97 NA NA
3: c 93  9 NA
4: d NA 67 86
5: e NA NA 72