2014-05-03 105 views
-2

我有一個不同範圍的原始輸入數據集。我想將它們作爲R列表存儲。數據是4維的。需要幫助填寫列表For循環在R

我創建了一個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]} 
    } 
    } 

} 
+0

複雜的代碼,以及缺乏有關預期內容細節的解釋。然後當我粘貼它看看會發生什麼,找不到'mask1_dir',所以我認爲你需要簡化這個問題併發佈一個可重現的例子。 –

回答

2

你的主要問題是,當你查看我在1:6766你重新初始化所有列表中的元素以空列表()■試(即掩碼1 $ 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的小數值開始,以確保首先看起來很好。