0

編集 要約: ここでの問題は、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" ...
4

1 に答える 1

1

わかりました、私は少しばかげていると感じます (わかりました、私は本当にばかげているように感じます)。私のループが先に進み、実際にリスト内の値を置き換えたので、出力として必要なものはすべてループ後の subM.List に格納されました。そして、値を1つのデータフレームに入れるために、単に「非公開」にしました:

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

お待ちいただきありがとうございます。

于 2013-07-02T23:21:42.583 に答える