2013-06-30 29 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) 

感谢您的耐心大家!