【问题标题】:R eval list strings for data.frames and then concat the data.framesR eval 列出 data.frames 的字符串,然后连接 data.frames
【发布时间】:2013-01-10 13:38:22
【问题描述】:

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

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

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

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

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

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

那行不通。有人可以帮帮我吗? 谢谢

【问题讨论】:

  • library(fortunes); fortune(106)

标签: r list eval dataframe


【解决方案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,这通常意味着你走错了路。

【讨论】:

  • 哇,这正是我所需要的。太感谢了。嗯,最后也没那么难。再次感谢。
【解决方案2】:

使用parseeval 的组合就像是在说您知道如何从纽约市到波士顿,因此通过从您的出发地到纽约,然后到波士顿,然后再到波士顿来制定您的所有旅行计划到您的目的地。在某些情况下,这可能还不错,但如果您从伦敦到巴黎旅行,那就有点绕路了。

您应该首先了解使用$[[ 的子集列表之间的关系和区别(有关文档,请参阅?'[[')以及何时使用,更重要的是不适合使用$。一旦您了解您应该能够找到不需要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 ) )

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 2021-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-29
    • 1970-01-01
    相关资源
    最近更新 更多