使用R中的列表更改嵌套for循环的输出

时间:2013-06-30 19:40:49

标签: r for-loop output

修改 摘要:我的问题在于,当我通过嵌套for循环运行一个包含四个数据帧的列表时(它正常工作并且正在做我需要它做的事情)我只能将输出放到矩阵的三列中我希望内部for循环的每个参数都有一个列。我认为循环正在为列表中的每个项目创建一个列(请参阅下面的输出),因为当我尝试将输出存储为单个列时,我收到此错误:维度数不正确。我需要列中的数据而不是将其存储在循环外部创建的整个矩阵中的原因是因为将来我将运行不同的文件,并且不知道循环将生成的行数。我真的很感激这方面的帮助,我仍然觉得很难理解如何从循环中获得某些输出,尽管相信我,这不是因为缺乏尝试。

这可能是一个非常容易解决的问题,但答案已经没有了。我有嵌套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" ...

1 个答案:

答案 0 :(得分:1)

好吧,我觉得有点傻(好吧,我觉得很傻)我之前没有意识到这一点。由于我的循环继续并且实际上替换了我的列表中的值,我作为输出所需的一切最终都存储在subM.List后循环中。为了将我的值放到一个数据框中,我只是“不公开”:

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

感谢大家的耐心等待!