【问题标题】:R-Store results from model into a matrixR-将模型中的结果存储到矩阵中
【发布时间】:2017-02-05 15:42:20
【问题描述】:

我寻找答案,但它们没有提供我想要的东西。我正在运行一些简单的模型,并试图将结果(主要是 LRT)放入表格或矩阵中,以便更好地呈现它们。但是,for 的命令不允许我这样做,这很奇怪,因为其他编程语言很容易做到。

在最后一句中,如果我替换 a[j] 或其他任何内容,它仍然会说 object a not found。如何使用 for 覆盖它?谢谢。

li<-array(c(716, 207,79,25,819,186,67,22), c(2,2,2))
dimnames(li)<-list(c("Normal","High"),c("N BP", "H BP"),c("A","B"))
#General Model with three variables and no interactions.
a1<-loglin(li,list(1,2,3))
#Model with XY,Z
a2<-loglin(li,list(c(1,2),3))
#Model with XZ,Y
a3<-loglin(li,list(c(1,3),2))
#Model with X,ZY
a4<-loglin(li,list(c(2,3),1))
#Model with XY,XZ
a5<-loglin(li,list(c(1,2),c(1,3)))
#Model with YZ,XZ
a6<-loglin(li,list(c(2,3),c(1,3)))
#Model with XY,ZY
a7<-loglin(li,list(c(1,2),c(2,3)))

tabi<-matrix(data=c(0),nrow=10,ncol=2)
for (j in 1:7) {
  i<-j
tabi[i,1]<-a[i]$lrt
}

旁注。我试过写“ai”、“aj”、“a[i]”等,都没有用。

【问题讨论】:

  • a[1]a1 不同
  • 我知道,我尝试了所有不同的组合,但都不起作用。

标签: r loops matrix


【解决方案1】:

如果您的工作区中有所有这些模型,您可以使用mget 提取,它返回一个列表,然后循环通过此列表提取lrt

所以对于你的例子,

sapply(mget(ls(pattern="a\\d")), "[", "lrt")

其中mget(ls(pattern="a\\d")) 使用anumber 模式从全局环境中获取数据,sapply 循环通过此列表进行提取。

作为替代工作流程,您可以将模型存储在列表中,而不是让大量模型在您的工作区中浮动。

所以将参数存储在列表中

para <- list(list(1,2,3), list(c(1,2),3), list(c(1,3),2))

然后循环这些应用模型

lst <- lapply(para, function(x) loglin(li, x))

这会将每个模型存储在lst 中。如果你只想要这个项目,你可以使用上面的loglin(li, x)$lrt。否则你可以像以前一样循环提取它。

sapply(lst, "[", "lrt")

注意您的代码是 a[1]a1 不同

【讨论】:

  • 谢谢。我会认为这是一个替代方案。
【解决方案2】:

对于那些想要更简单的答案并且和我一样的人,这里有一个更简单的方法,涉及更少的编码:

基本上只需创建一个列表并通过添加 [[]] 将您的模型定义为列表,就是这样。定期运行您的代码。

a<-list()
#General Model with three variables and no interactions.
a[[1]]<-loglin(li,list(1,2,3))
#Model with XY,Z
a[[2]]<-loglin(li,list(c(1,2),3))
#Model with XZ,Y
a[[3]]<-loglin(li,list(c(1,3),2))
#Model with X,ZY
a[[4]]<-loglin(li,list(c(2,3),1))
#Model with XY,XZ
a[[5]]<-loglin(li,list(1:2,1:3))
#Model with YZ,XZ
a[[6]]<-loglin(li,list(2:3,1:3))
#Model with XY,ZY
a[[7]]<-loglin(li,list(1:2,2:3))

tabi<-matrix(data=c(0),nrow=10,ncol=2)

for (j in 1:7) {
  i<-j
tabi[i,1]<-a[[j]]$pearson
}

【讨论】:

    【解决方案3】:

    可以使用 paste 将 a 和循环中的 i 的值连接起来,以将 a1、a2、a3 等作为字符串,然后使用 eval 和 parse 将其评估为变量。

    tabi<-matrix(data=c(0),nrow=10,ncol=2)
    for (i in 1:7) {
    
      tabi[i,1]<-eval(parse(text = paste("a",i,sep="")))$lrt
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-11
      • 2019-06-24
      • 1970-01-01
      • 2015-02-16
      相关资源
      最近更新 更多