lapply真的如何工作 - lapply dcast?

Mat*_*ert 4 r reshape lapply

显然,我仍然不完全理解lapply是如何工作的.当然,它将一个函数应用于列表元素并返回一个列表.然而,当它与自定义功能一起使用时,我不太确定如何有效地使用它.我想在使用dcast的自定义函数中使用它.

首先让我们得到一个示例数据集:

df1 <- data.frame(idx=c(rep("a",3),rep("b",3),rep("c",3)),
              cat=rep(1:3,3),var1=rnorm(9,0,1)
 )



df2 <- data.frame(idx=c(rep("a",4),rep("b",4),rep("c",4)),
              cat2=rep(1:4,3),var1=rnorm(12,0,1)
              )

mylist <- list(cat=df1,cat2=df2)


library(reshape2)

### result that I want to get just for one data.frame
dcast(df1,idx~cat,value_var="var1")
Run Code Online (Sandbox Code Playgroud)

但是,我无法用拉普利去做,我试过:

lapply(mylist,function(x) substitute(dcast(x,idx~x,value_var="var1")))
## returns
$cat
dcast(X[[2L]], idx ~ X[[2L]], value_var = "var1")
Run Code Online (Sandbox Code Playgroud)

显然,在评估表达式时,X [[2L]]不起作用.我还试过了

lapply(names(mylist), function(x) dcast(mylist[[x]],idx~x,value_var="var1" ))
Run Code Online (Sandbox Code Playgroud)

这是在一些类似的问题,但在这里引起了一个错误.我应该在这里使用吗?

编辑:我很惊讶约书亚的答案正是我想要的.我曾经在那条路上,但在我尝试的时候就把它解雇了:

 test <- function(x){
 myformula <- as.formula(paste("idx~",x,sep=""))
 myformula
 }

 test(df2) 
 ## returns
 ## > idx ~ c(1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3)
 ## > <environment: 0x104f0a4d8>
Run Code Online (Sandbox Code Playgroud)

显然太早了,但你能解释一下会发生什么吗?

Jos*_*ich 5

在第一个示例中,x是一个传递给您的函数的对象.在第二个例子中,它是一个字符串.在这两种情况下,它都不是表示data传递给的变量的符号dcast.

您需要使用list元素的名称构造公式,如下所示:

# define the function
myfunc <- function(varname) {
  # 'varname' is a character string naming the column to use
  myformula <- as.formula(paste("idx~",varname,sep=""))
  dcast(mylist[[varname]], myformula, value_var="var1")
}
# loop over list elements, by name
lapply(names(mylist), myfunc)
Run Code Online (Sandbox Code Playgroud)