編集 要約: ここでの問題は、4 つのデータ フレームのリストをネストされた for ループ (正しく機能し、必要なことを実行している) で実行すると、行列の 3 つの列にしか出力を取得できないことです。内部 for ループのパラメータごとに 1 つの列を使用することを好みます。出力を単一の列として保存しようとすると、次のエラーが発生するため、ループがリストの各項目の列を作成していると考えています (以下の出力を参照してください)。次元の数が正しくありません。ループの外で作成されたマトリックス全体にデータを格納するのではなく、データを列に格納する必要がある理由は、将来、別のファイルを実行し、ループによって生成される行の量がわからないためです。私は本当にこれについて助けていただければ幸いです、私は'
これは解決するのが非常に簡単な問題かもしれませんが、答えは私にはわかりませんでした. for ループをネストしており、入力は 4 つのデータ フレームのリストです (ただし、この数はデータ セットによって異なります)。私の入力はリストのままであることが重要です。これまでのところ、これらの出力を格納するためのマトリックスを作成しました。出力は最終的にマトリックスの 3 つの個別の列になります。これは、リストの項目ごとに 1 つの列であると想定しています (しかし、コードはリストの 4 つの項目のうち 3 つを変更するだけです)。
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
まず、出力をデータ フレームやマトリックスではなく、変数ごとに 1 つの列にしたいと思います (そして、ループの外で 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
最後に、入力を表すリスト (4 つのリスト) の 2 番目のデータフレームのサンプルを次に示します。
[[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) の詳細を以下に示します。上記の入力のサンプルを、実際にはループ内で変更されるリストの 2 番目の項目に変更しました。
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" ...