为数据帧设置R eval列表字符串,然后连接data.frames

时间:2013-01-10 13:38:22

标签: r list eval dataframe

我有以下情况,我非常绝望。

paste("crossdata","$geno$'",1:4,"'$data",sep="")

生成4个字符串,如下所示:

"crossdata$geno$'1'$data" "crossdata$geno$'2'$data" "crossdata$geno$'3'$data" "crossdata$geno$'4'$data"

我想通过评估其中一个字符串并通过cbind将它们组合来检索这4个字符串的相应data.frames。但是当我做这样的事情时:

cbind(sapply(parse(text=paste("crossdata","$geno$'",i,"'$data",sep="")),eval))

不起作用。有人可以帮帮我吗? 感谢

2 个答案:

答案 0 :(得分:1)

datlist <- list(adat=data.frame(u=1:5,v=6:10),bdat=data.frame(x=11:15,y=16:20))

extdat <- c("datlist$adat","datlist$bdat")

do.call('cbind',lapply(extdat,function(i) eval(parse(text=i))))

  u  v  x  y
1 1  6 11 16
2 2  7 12 17
3 3  8 13 18
4 4  9 14 19
5 5 10 15 20

当然,这会使用eval + parse,这通常意味着您走错了路。

答案 1 :(得分:1)

使用parseeval的组合就像是说你知道如何从纽约市到达波士顿,从而制定所有旅行计划,从出发地到纽约,然后到波士顿,然后到你的desitination。在某些情况下,这可能并不坏,但如果你从伦敦到巴黎旅行,那将是一个长途跋涉。

您应首先使用$[[了解子集列表之间的关系和差异(有关文档,请参阅?'[['),何时更为重要,更重要的是,不适合使用$。了解到您应该能够找到不需要parseeval的解决方案。

您的问题可能很简单(因为您的示例无法重复,因此未经测试):

do.call( cbind, lapply( 1:4, function(x) crossdata[['geno']][[x]][['data']] ) )

或可能

do.call(cbind, lapply(as.character(1:4), function(x) crossdata$geno[[x]]$data ) )