【问题标题】:For loop to 1) extract and 2) paste to an object, in RFor循环到1)提取和2)粘贴到一个对象,在R
【发布时间】:2014-11-28 10:57:11
【问题描述】:

我已经通过 MCMCglmm 运行了一些数据以生成 16 个链 - 它们是 .rda 文件,每个文件具有以下结构,看起来有点像这样(列表有 16 个组件,例如 Sol、VCV、DIC..,我'只发布了顶部,因为它很长)总共有 16 个列表(每个链一个):

> dput(lapply(chain_shortA1, function(x) head(x,3))[1])
structure(list(Sol = structure(c(1.04619275548612, 1.05064026996843, 
1.0508443605213, 1.05060001081438, 25.347877898399, 23.9721841898718, 
25.137209308421, 23.7787279045151, 65.739413601812, 63.8638016616824, 
65.9364721911843, 65.2303675767507, -0.133519658555997, -0.140548052135273, 
-0.135612305268296, -0.141013350017602, 29.0450402791412, 29.2720730875153, 
27.966162882396, 28.8481791445811, 50.6246755414177, 49.9310506192269, 
52.2747936783417, 50.0815610028321), .Dim = c(4L, 6L), .Dimnames = list(
    NULL, c("(Intercept)", "traitcl_f", "traitls_f", "traitbs_m", 
    "traitcl_m", "traitls_m")), mcpar = c(101, 131, 10), class = "mcmc")), .Names = "Sol")

我需要为每个链提取和存储这些项目的数量,例如只有两个链和两个值,有四种组合:

chain_shortA1_DIC = chain_shortA1$DIC
chain_shortA1_VCV = chain_shortA1$VCV
chain_shortA2_DIC = chain_shortA2$DIC
chain_shortA2_VCV = chain_shortA2$VCV

我认为这可以通过首先提供我想要的链和值的列表来完成:

chains = list ("chain_shortA1","chain_shortA2")
values = list ("DIC", "VCV")

然后通过循环运行它以生成所有四个项目。但是,我在循环部分苦苦挣扎(我不是最流畅的循环编写者)。这是我目前的尝试,但它没有达到我的预期:

for (i in 1:length(chains)){
    eval( parse( text = paste(chains[i], "$", values[i], sep = "")))
    }

作为一个原则证明,在循环中打印值的脚本确实工作:

> eval( parse( text = paste(chains[1], "$", values[1], sep = "")))
[1] 125861.2

此外,当我尝试以下操作时,我也遇到了问题(每个对象都应存储为 'chain'_'value' 例如chain_shortA1_DIC,如上所述)

for (i in 1:length(chains)){
    paste(chains[i],"_",values[i]) = eval( parse( text = paste(chains[i], "$", values[i], sep = "")))
    }

如果有任何不清楚的地方,请发表评论,我会编辑/回复以澄清

【问题讨论】:

  • 如果可以dput的头chain_shortA1,可能会更容易测试
  • @akrun 你能扩展一下吗?我不知道你的意思是什么
  • 如果您在控制台上运行dput(head(chain_shortA1)),它将给出数据集的结构作为输出。将该输出复制/粘贴到您的帖子中将使其他人更容易理解您的数据,并且还可以作为测试代码的示例。
  • @akrun dput() with head 在我的控制台中产生了大约 1500 行 - 我使用 dput() 代替名称 - 这有帮助吗?

标签: r for-loop


【解决方案1】:

您的循环是正确的,但它没有将结果存储在任何地方。

但这也比必要的复杂 - 你不需要parse/eval,因为x$y 相当于x[['y']]。所以你可以这样做:

chains[i][[values[i]]]

... 并将结果分配给某个变量:

assign(paste(chains[i], values[i], sep = '_'), chains[i][[values[i]]])

但我认为首先创建这样的变量并不是一个好主意:除了使用 chain_shortA1_DIC 格式的变量之外,您还可以使用嵌套列表,这似乎是原始的您已经开始使用的数据格式。


顺便说一句,paste(…, sep = '') 等同于paste0(…)。但在你的情况下,你甚至确实有一个分隔符,因为你写了paste(…, '$', …, sep ='')。这当然可行,但 paste 的使用方式是这样的:paste(…, …, sep = '$')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-05
    相关资源
    最近更新 更多