当'i'不是数字而是字符时,如何在矩阵中存储循环的值?

时间:2016-07-22 13:43:23

标签: r

为了给我的问题提供一些上下文,我有一个大数据集。我想基于列变量(它是一个字符向量)分析子集中的数据集。然后我想将此结果的一部分存储在矩阵中。我之前使用过循环将从循环中每个循环计算出的值存储到矩阵中,但仅当'i'是数字而不是字符时。

到目前为止我的内容如下: 主要问题是我使用'i'来确定我想要存储值的矩阵的位置,但是当'i'是一个字符时它不起作用。

list <- c("xyz","usd","lki","josdl","olid"......"kadl")
output= matrix(ncol=5, nrow=length(unique(c))

for(i in list){
    x <- filter(df, colvar == "i")
    if(nrow(x) <=1) next
    y <- metagen(RR, SE, data=x) #meta-analysis results

  ###### Inputting values from metagen into dataframe ####
      meta.analysis[i,1] = "i" #colvar
      meta.analysis[i,2] = y$TE.fixed #fixed effect model
      meta.analysis[i,3] = y$seTE.fixed #seTE.fixed
      meta.analysis[i,4] = y$lower.fixed #95%CI-lower bound, fixed.effect
      meta.analysis[i,5] = y$upper.fixed #95%CI-upper bound, fixed effect
      meta.analysis[i,6] = y$zval.fixed #Z-value, fixed effect
      meta.analysis[i,7] = y$pval.fixed #P-value of Z-value, fixed effect

      meta.analysis[i,8] = y$TE.random #random effect model
      meta.analysis[i,9] = y$seTE.random #seTE.random
      meta.analysis[i,10] = y$lower.random #95%CI-lower bound, random.effect
      meta.analysis[i,11] = y$upper.random #95%CI-upperbound, random effect
      meta.analysis[i,12] = y$zval.random #Z-value, random effect
      meta.analysis[i,13] = y$pval.random #P-value of Z-value, random effect

      meta.analysis[i,14] = y$k #Number of studies
}

任何帮助/输入将不胜感激! =)

1 个答案:

答案 0 :(得分:0)

考虑使用sapply()的向量化方法,因为metagen对象返回各种组件的列表:

list <- c("xyz","usd","lki","josdl","olid"......"kadl")

meta.analysis <- sapply(list, function(i){
         x <- filter(df, colvar == i)    
         y <- metagen(RR, SEE, data = x)[c("TE.fixed", "seTE.fixed", "lower.fixed",
                                           "upper.fixed", "zval.fixed", "pval.fixed",
                                           "TE.random", "seTE.random", "lower.random", 
                                           "upper.random", "zval.random", "pval.random")]
         y <- c(i, y)   # colvar
         return(y)               
     }
)

为了确保矩阵返回,请考虑vapply() - 但是,忽略 colvar ,因为它是一个字符而不是数字,矩阵中的元素必须是一种类型:

meta.analysis <- vapply(list, function(i) { ...same as above...}, 
                        FUN.VALUE = numeric(12))