首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >lapply是如何真正工作的- lapply dcast?

lapply是如何真正工作的- lapply dcast?
EN

Stack Overflow用户
提问于 2012-01-31 23:21:54
回答 1查看 784关注 0票数 4

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

首先,让我们获取一个示例数据集:

代码语言:javascript
复制
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")

但是我不能把这个和lapply一起使用,我试过了:

代码语言:javascript
复制
lapply(mylist,function(x) substitute(dcast(x,idx~x,value_var="var1")))
## returns
$cat
dcast(X[[2L]], idx ~ X[[2L]], value_var = "var1")

显然,在计算表达式时,X[2L]将不起作用。我尝试了更多

代码语言:javascript
复制
lapply(names(mylist), function(x) dcast(mylist[[x]],idx~x,value_var="var1" ))

它在一些类似的issue中工作,但在这里导致了一个错误。我应该和这里一起使用吗?

编辑:我很惊讶Joshua的答案正是我想要的。我以前也是这样做的,但当我尝试的时候,我放弃了它:

代码语言:javascript
复制
 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>

显然还为时过早,但你能解释一下发生了什么吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-01-31 23:31:04

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

您需要使用列表元素的名称来构造公式,因此如下所示:

代码语言:javascript
复制
# 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)
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9082047

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档