2013-06-30 24 views
0

編輯 摘要:我在這裏的問題是,當我通過嵌套運行四個數據幀的列表循環(其正常工作和正在做什麼,我需要它要做)我只能得到輸出到矩陣的三列,當我更願意爲我的內部for循環的每個參數有一個列。我在考慮循環爲列表上的每個項目創建一個列(請參閱下面的輸出),因爲當我嘗試將輸出存儲爲單列時,出現此錯誤:不正確的維數。我需要列中的數據而不是將其存儲在循環外創建的整個矩陣中的原因是,將來我將運行不同的文件,並且不會知道循環將生成的行數。我真的很感謝這方面的幫助,但我仍然覺得很難理解如何從循環中獲得某些輸出,儘管相信我,這並不是因爲缺乏嘗試。塗改輸出嵌套的循環與列表中的R

這可能是一個非常容易解決的問題,但答案已經避開了我。我嵌套for循環,我的輸入是一個四個數據框的列表(雖然這個數字可能會隨不同的數據集而變化)。我的意見留在列表中很重要。到目前爲止,我已經創建了矩陣來存儲這些輸出,並且輸出最終進入矩陣的三個單獨列,我假設這是因爲它是列表上每個項目的一列(我知道我說過列表,但是代碼只能對列表上的四個項目中的三個項目進行更改)。

LAT <- matrix(data=NA, nrow=50, ncol=5) #Matrices to store the output in 
LON <- matrix(data=NA, nrow=50, ncol=5) #but ideally these would be columns: LON <- c() 
Impute <- matrix(data=NA, nrow=50, ncol=5) 
ID <- matrix(data=NA, nrow=50, ncol=5) 

for (i in 1:length(subM.List)) { #Looping through each submatrix in the list (i loops through each submatrix on list) 
    for (j in 2:nrow(subM.List[[i]])) { #Loop through each row of each submatrix in the list (j loops through each row on each submatrix) 
    if ((subM.List[[i]][j, "LAT"] == -180) & #if there is a -180 and a value greater than 0 in activityIN, break the inner for loop 
     (subM.List[[i]][j-1, "ACTIVITYIN"] != 0)) { #Will break if it find a -1, -2, 1, 2, 3, or 4. 
    break 
} 
else if ((subM.List[[i]][j, "LAT"] == -180) & 
      (subM.List[[i]][j, "ACTIVITYIN"] == 0)) { 
    ID[j,i] <- (subM.List[[i]][j,"ID"]) #Imputation 1, imputing data points with 0 activity intensity and -180 for LON 
    LAT[j,i] <- (subM.List[[i]][j,"LAT"] = subM.List[[i]][j-1,"LAT"]) 
    LON[j,i] <- (subM.List[[i]][j,"LON"] = subM.List[[i]][j-1,"LON"]) 
    Impute[j,i] <- (subM.List[[i]][j,"Impute"] = 1) #populates the impute column. If point has been imputed, row will have a 1 value 
    ctr <- (ctr + 1)} 
    } 
} 

loopOutput = cbind(LAT, LON, Impute, ID) #binding together the 4 columns of the loop output 

從LON可變電流輸出看起來像這樣:

> LON 
     [,1]  [,2]  [,3]  [,4] 

[1,] NA  NA  NA  NA 
[2,] NA  NA  NA  NA 
[3,] NA  NA  NA  NA 
[4,] NA  NA  NA  NA 
[5,] NA  NA  NA  NA 
[6,] NA  NA  NA  NA 
[7,] NA  NA  NA  NA 
[8,] NA  NA  NA  NA 
[9,] NA  NA  NA  NA 
[10,] NA  NA  NA  NA 
[11,] NA  NA  NA  NA 
[12,] NA -117.2295 -117.2289 -117.2295 
[13,] NA -117.2295 -117.2289 -117.2295 
[14,] NA -117.2295 -117.2289 -117.2295 
[15,] NA  NA -117.2289 -117.2295 
[16,] NA  NA -117.2289 -117.2295 
[17,] NA  NA -117.2289 -117.2295 
[18,] NA  NA -117.2289 -117.2295 
[19,] NA  NA -117.2289 -117.2295 
[20,] NA  NA -117.2289 -117.2295 
[21,] NA  NA -117.2289 -117.2295 
[22,] NA  NA -117.2289 -117.2295 
[23,] NA  NA -117.2289 -117.2295 
[24,] NA  NA -117.2289 -117.2295 
[25,] NA  NA -117.2289 -117.2295 
[26,] NA  NA -117.2289  NA 
[27,] NA  NA -117.2289  NA 
[28,] NA  NA -117.2289  NA 
[29,] NA  NA -117.2289  NA 
[30,] NA  NA -117.2289  NA 
[31,] NA  NA -117.2289  NA 
[32,] NA  NA -117.2289  NA 
[33,] NA  NA -117.2289  NA 
[34,] NA  NA -117.2289  NA 
[35,] NA  NA -117.2289  NA 
[36,] NA  NA -117.2289  NA 
[37,] NA  NA -117.2289  NA 
[38,] NA  NA -117.2289  NA 
[39,] NA  NA -117.2289  NA 
[40,] NA  NA -117.2289  NA 
[41,] NA  NA -117.2289  NA 
[42,] NA  NA -117.2289  NA 
[43,] NA  NA  NA  NA 
[44,] NA  NA  NA  NA 
[45,] NA  NA  NA  NA 

首先,我想的輸出爲對於每個變量,而不是一個數據幀或矩陣的單個列(然後在循環之外執行我的cbind)。另外,我只想要數字輸出,通過循環實際改變的項目,沒有包含任何NA(儘管我認識到現在大部分NA是來自我的矩陣維度)。所以,例如,我的LON變量將是一個包含所有由循環產生的數字行的列。我期望輸出的一個小樣本應該是這樣的:

的所有列cbind後:

  LAT  LON  Impute ID 
[475,] 32.81331 -117.2295  1 1021 
[476,] 32.81331 -117.2295  1 1022 
[477,] 32.81331 -117.2295  1 1023 
[478,] 32.81331 -117.2295  1 1148 
[479,] 32.81331 -117.2295  1 1149 
[480,] 32.81331 -117.2295  1 1150 
[481,] 32.81331 -117.2295  1 1151 
[482,] 32.81331 -117.2295  1 1152 
[483,] 32.81331 -117.2295  1 1153 
[484,] 32.81331 -117.2295  1 1154 
[485,] 32.81331 -117.2295  1 1155 
[486,] 32.81331 -117.2295  1 1156 
[487,] 32.81331 -117.2295  1 1157 
[488,] 32.81331 -117.2295  1 1158 

最後,這裏是我的名單上第二個數據幀的樣本(四列表)表示輸入:

[[2]] 
    FIXTYPE  LON  LAT ACTIVITYIN Impute ID 
537  6 -117.2295 32.81602   0  NA 537 
538  6 -117.2295 32.81602   0  NA 538 
539  6 -117.2295 32.81602   0  NA 539 
540  6 -117.2295 32.81602   0  NA 540 
541  6 -117.2295 32.81602   0  NA 541 
542  6 -117.2295 32.81602   0  NA 542 
543  6 -117.2295 32.81602   0  NA 543 
544  6 -117.2295 32.81602   0  NA 544 
545  6 -117.2295 32.81602   0  NA 545 
546  6 -117.2295 32.81602   0  NA 546 
547  6 -117.2295 32.81602   0  NA 547 
548  7 -180.0000 -180.00000   0  NA 548 
549  7 -180.0000 -180.00000   0  NA 549 
550  7 -180.0000 -180.00000   0  NA 550 
551  7 -180.0000 -180.00000   1  NA 551 
552  7 -180.0000 -180.00000   1  NA 552 

而且,抱歉,這是這麼長時間,我只是想成爲我的輸入,輸出和預期的產出超清晰。任何幫助將真正和真正的讚賞,因爲我一直在努力研究這個腳本一段時間。

編輯:由於註釋,在輸入(subM.List)更詳細地是以下,我已經改變了輸入的樣品上方到列表上的第二項,這將實際內的改變循環。

str(subM.List) 
List of 4 
$ : num [1:11, 1:6] 5 5 5 5 5 5 5 5 5 5 ... 
    ..- attr(*, "dimnames")=List of 2 
    .. ..$ : chr [1:11] "452" "453" "454" "455" ... 
    .. ..$ : chr [1:6] "FIXTYPE" "LON" "LAT" "ACTIVITYIN" ... 
$ : num [1:137, 1:6] 6 6 6 6 6 6 6 6 6 6 ... 
    ..- attr(*, "dimnames")=List of 2 
    .. ..$ : chr [1:137] "537" "538" "539" "540" ... 
    .. ..$ : chr [1:6] "FIXTYPE" "LON" "LAT" "ACTIVITYIN" ... 
$ : num [1:315, 1:6] 5 5 5 5 5 5 5 5 5 5 ... 
    ..- attr(*, "dimnames")=List of 2 
    .. ..$ : chr [1:315] "718" "719" "720" "721" ... 
    .. ..$ : chr [1:6] "FIXTYPE" "LON" "LAT" "ACTIVITYIN" ... 
$ : num [1:26, 1:6] 5 5 5 5 5 5 5 5 5 5 ... 
    ..- attr(*, "dimnames")=List of 2 
    .. ..$ : chr [1:26] "1134" "1135" "1136" "1137" ... 
    .. ..$ : chr [1:6] "FIXTYPE" "LON" "LAT" "ACTIVITYIN" ... 
+0

知道'subM.List'的結構似乎很重要,但我看不到它的描述。最好的辦法是發佈'str(subM.List)' –

+0

你所顯示的輸入數據幀會遺漏最有趣的值('LAT == -180')。 – sgibb

+0

感謝您的意見,我只是做了這些改變。 – Misc

回答

1

好吧,我覺得有點傻(好吧,我覺得很傻),我沒有意識到這一點。由於我的循環繼續前進,實際上取代了列表中的值,所以我需要的所有輸出都存儲在subM.List post-loop中。而讓我的值到一個數據幀我只是「不公開」,:

loopOutput <- ldply(subM.List, data.frame) 

感謝您的耐心大家!