在R中需要帮助填充列表与For循环

时间:2014-05-03 01:23:56

标签: r for-loop nested-lists

我有一个不同范围原始输入的数据集。我希望将它们作为列表存储在R中。数据是4维的。

我创建了一个for循环来将数据存储在嵌套列表中,但数据似乎只属于最后一个列表。我似乎无法找到循环问题。

我有两个不同的清单。在其中一个中,我将数据堆叠在一起,工作正常,所以我似乎没有数据采集的问题。对于嵌套循环,它会跳过列表的第一层并正确存储最后获取的数据。我附上了代码,我很感激任何帮助。感谢。

mask1 = list()
mask2 = list()
mask3 = list()
mask4 = list()
mask5 = list()

mask1$vid = list()
mask2$vid = list()
mask3$vid = list()
mask4$vid = list()
mask5$vid = list()

mask1$all = list()
mask2$all = list()
mask3$all = list()
mask4$all = list()
mask5$all = list()

for (i in 1:6766){
  f <- i%%199
  v <- ceiling(i/199)
  if (f==0){
    f=199;
  }

  mask1$vid[[v]] = list()
  mask2$vid[[v]] = list()
  mask3$vid[[v]] = list()
  mask4$vid[[v]] = list()
  mask5$vid[[v]] = list()

  mask1$vid[[v]][[f]] = list()
  mask2$vid[[v]][[f]] = list()
  mask3$vid[[v]][[f]] = list()
  mask4$vid[[v]][[f]] = list()
  mask5$vid[[v]][[f]] = list()

  data1 = read.table(mask1_dir[i])
  data2 = read.table(mask2_dir[i])
  data3 = read.table(mask3_dir[i])
  data4 = read.table(mask4_dir[i])
  data5 = read.table(mask5_dir[i])

  data1=t(data1)
  data2=t(data2)
  data3=t(data3)
  data4=t(data4)
  data5=t(data5)


  for (j in 1:8) {
    m1 <- data1[,j]
    m2 <- data2[,j]
    m3 <- data3[,j]
    m4 <- data4[,j]
    m5 <- data5[,j]

    m1<-m1[m1>0]
    m2<-m2[m2>0]
    m3<-m3[m3>0]
    m4<-m4[m4>0]
    m5<-m5[m5>0]


    mask1$vid[[v]][[f]][[j]] = t(data.frame(m1))
    mask2$vid[[v]][[f]][[j]] = t(data.frame(m2))
    mask3$vid[[v]][[f]][[j]] = t(data.frame(m3))
    mask4$vid[[v]][[f]][[j]] = t(data.frame(m4))
    mask5$vid[[v]][[f]][[j]] = t(data.frame(m5))

    mask1$vid[[v]][[f]][[j]]

    if (v==1 & f==1){
      mask1$all[[j]] = t(data.frame(m1))
      mask2$all[[j]] = t(data.frame(m2))
      mask3$all[[j]] = t(data.frame(m3))
      mask4$all[[j]] = t(data.frame(m4))
      mask5$all[[j]] = t(data.frame(m5))

    }
      else{
        for (k in 1:length(m1)){
          mask1$all[[j]][(length(mask1$all[[j]])+1)] = m1[k]}
        for (k in 1:length(m2)){
          mask2$all[[j]][(length(mask2$all[[j]])+1)] = m2[k]}
        for (k in 1:length(m3)){
          mask3$all[[j]][(length(mask3$all[[j]])+1)] = m3[k]}
        for (k in 1:length(m4)){
          mask4$all[[j]][(length(mask4$all[[j]])+1)] = m4[k]}
        for (k in 1:length(m5)){
          mask5$all[[j]][(length(mask5$all[[j]])+1)] = m5[k]}
    }
  }

}

1 个答案:

答案 0 :(得分:2)

你遇到的主要问题是当你在1:6766中查看我时,你将所有列表元素重新初始化为空列表()s(即mask1 $ vid [[v]] = list()将清除早期循环中[[v]]索引中的任何内容)。所以你需要将初始化与累积分开。你还有很多冗余代码。

这是一种可能的替代方案,它使用1个MASK的列表,并使用3-D列表数组进行vid而不是列表列表。

M<-5
F<-199
V<-34
J<-8

#full initialization
mask <- lapply(1:M, function(x) {
    list(
        vid=array(list(NULL),dim=c(V,F,J)), 
        all=lapply(1:J, function(x) numeric(0)))
})
mask_dir<-list(m1=character(F*V), m2=character(F*V), m3=character(F*V), m4=character(F*V),m5=character(F*V))

read.table.fake<-function(...) {return(data.frame(matrix(rep(1:3, each=J), nrow=J, ncol=3)))}

for(f in 1:F) {
    for(v in 1:V) {
        i<- f + (v-1)*199
        data<-lapply(1:M, function(x) t(read.table.fake(mask_dir[[x]][i], i)))
        for(j in 1:J) {
            ppdata <- lapply(1:M, function(x) Filter(function(z) {z>0}, data[[x]][,j]))
            for(m in 1:M) {
                mask[[m]]$vid[[v,f,j]] <- ppdata[[m]]
                mask[[m]]$all[[j]] <- c(mask[[m]]$all[[j]], ppdata[[m]])
            }
        }   
    }
}

我已经包含了一个假的read.table,因为你真的没有说明你的数据实际上是什么样的。我假设每个文件必须有8行,可能是可变数量的列,所有值都是数字?我还将mask_dir变量组合到一个列表中,使mask_dir=list(mask1_dir, mask2_dir, mask3_dir, mask4_dir, mask5_dir)

所以代码更短但运行起来需要一段时间,因为这需要大量的循环和文件读取。

要获取元素,您可以使用mask[[5]]$vid[[3,1,2]]而不是mask5$vid[[3]][[1]][[2]]mask[[2]]$all[[3]]而不是mask2$all[[3]]

为了测试,我从小F和V值开始,只是为了确保事情看起来很好。