編輯 摘要:我在這裏的問題是,當我通過嵌套運行四個數據幀的列表循環(其正常工作和正在做什麼,我需要它要做)我只能得到輸出到矩陣的三列,當我更願意爲我的內部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" ...
知道'subM.List'的結構似乎很重要,但我看不到它的描述。最好的辦法是發佈'str(subM.List)' –
你所顯示的輸入數據幀會遺漏最有趣的值('LAT == -180')。 – sgibb
感謝您的意見,我只是做了這些改變。 – Misc