【发布时间】: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() 代替名称 - 这有帮助吗?