R中循环中的数据帧和替换问题

时间:2011-08-30 23:01:03

标签: r dataframe

我在包含旅行的数据集上使用R.每一行都是一次旅行(从A到B)。在每一行,我都知道个人的身份(一个数字),旅行的目的(1,2,3或4),时间类别(1,2或3)以及识别旅行的数字旅行完成了(旅行是一组旅行;所有这些旅行从A到A)。

我想创建一个新行:对于同一个人,在不同的游览中同一时间类别中前一次旅行的目的是什么。此变量称为“prevDistanceSameTimeCategoryDifferentTour”。

我有这个错误:

  

错误   $<-.data.frame*tmp*, “prevDistanceSameTimeCategoryDifferentTour”,   :替换有2行,数据有1167

这是我的代码:

prevPersonTimeCategory <- array(-999, dim=c(3,3))
prevPersonTimeCategory[1,1] <- TgData$PersonID[1]
prevPersonTimeCategory[2,1] <- TgData$PersonID[1]
prevPersonTimeCategory[3,1] <- TgData$PersonID[1]
for(i in 2:nrow(TgData)) {
    if (TgData$timeCategory[i] == 1) {
        if (TgData$tour[i] == prevPersonTimeCategory[1,3]) {
            if (prevPersonTimeCategory[1,1] == TgData$PersonID[i]) {
                TgData$prevPurposeSameTimeCategoryDifferentTour[i] <- prevPersonTimeCategory[1,2]
                }
            else {
                TgData$prevPurposeSameTimeCategoryDifferentTour[i] <- -999
                prevPersonTimeCategory[1,1] <- TgData$PersonID[i]
                }   
            }
        else {
            if (prevPersonTimeCategory[1,1] == TgData$PersonID[i]) {
                prevPersonTimeCategory[1,3] <- TgData$tour[i]
                TgData$prevPurposeSameTimeCategoryDifferentTour[i] <- prevPersonTimeCategory[1,2]
                prevPersonTimeCategory[1,2] <- TgData$purpose[i]
                }
            else {
                TgData$prevPurposeSameTimeCategoryDifferentTour[i] <- -999
                prevPersonTimeCategory[1,1] <- TgData$PersonID[i]
                prevPersonTimeCategory[1,2] <- -999
                }
            }
        }
    else if (TgData$timeCategory[i] == 2) {
        if (TgData$tour[i] == prevPersonTimeCategory[2,3]) {
            if (prevPersonTimeCategory[2,1] == TgData$PersonID[i]) {
                TgData$prevPurposeSameTimeCategoryDifferentTour[i] <- prevPersonTimeCategory[2,2]
                }
            else {
                TgData$prevPurposeSameTimeCategoryDifferentTour[i] <- -999
                prevPersonTimeCategory[2,1] <- TgData$PersonID[i]
                }   
            }
        else {
            if (prevPersonTimeCategory[2,1] == TgData$PersonID[i]) {
                print(i)
                prevPersonTimeCategory[2,3] <- TgData$tour[i]
                TgData$prevPurposeSameTimeCategoryDifferentTour[i] <- prevPersonTimeCategory[2,2]
                prevPersonTimeCategory[2,2] <- TgData$purpose[i]
                }
            else {
                TgData$prevPurposeSameTimeCategoryDifferentTour[i] <- -999
                prevPersonTimeCategory[2,1] <- TgData$PersonID[i]
                prevPersonTimeCategory[2,2] <- -999
                }
            }
        }
    else if (TgData$timeCategory[i] == 3) {
        if (TgData$tour[i] == prevPersonTimeCategory[3,3]) {
            if (prevPersonTimeCategory[3,1] == TgData$PersonID[i]) {
                TgData$prevPurposeSameTimeCategoryDifferentTour[i] <- prevPersonTimeCategory[3,2]
                }
            else {
                TgData$prevPurposeSameTimeCategoryDifferentTour[i] <- -999
                prevPersonTimeCategory[3,1] <- TgData$PersonID[i]
                }   
            }
        else {
            if (prevPersonTimeCategory[3,1] == TgData$PersonID[i]) {
                prevPersonTimeCategory[3,3] <- TgData$tour[i]
                TgData$prevPurposeSameTimeCategoryDifferentTour[i] <- prevPersonTimeCategory[3,2]
                prevPersonTimeCategory[3,2] <- TgData$purpose[i]
                }
            else {
                TgData$prevPurposeSameTimeCategoryDifferentTour[i] <- -999
                prevPersonTimeCategory[3,1] <- TgData$PersonID[i]
                prevPersonTimeCategory[3,2] <- -999
                }
            }
        }
    else {
        TgData$prevPurposeSameTimeCategoryDifferentTour[i] = -999
        }
    }

我正在创建一个数组来存储每个时间类别的信息。在这个数组中,第一个值是个体的身份(prevPersonTimeCategory [1,1],prevPersonTimeCategory [2,1],prevPersonTimeCategory [3,1],每个时间类别一个),第二个是目的(prevPersonTimeCategory [ 1,2]等),第三个是旅游号码(prevPersonTimeCategory [1,3]等)。 然后我只是阅读每一行(for)并写一些条件(如果)。

我真的不知道我在哪里犯错。

我的数据集包含36'784行,但我正在测试1932行(标题为-1行)。数据如下所示:

PersonID    purpose tour    timeCategory
1   1   1   2
1   4   2   3
1   4   2   3
1   4   3   3
1   3   4   3
1   4   5   3
1   4   5   2
1   4   5   3
1   3   5   3
1   4   6   2
1   4   6   2
1   4   6   3
1   3   7   3
1   4   8   3
1   4   9   3
1   4   10  3
1   4   10  3
1   4   11  1
1   4   12  1
1   4   13  1
1   4   14  1
1   4   16  1
1   1   17  2
1   4   18  3
1   4   19  2
1   3   20  3
1   4   20  3
1   4   21  3
1   1   22  2
1   3   22  3
1   3   23  3
1   4   24  3
1   4   25  3
1   4   25  3
1   4   26  3
1   1   27  2
1   3   27  3
1   4   28  3
1   3   28  3
1   4   29  3
1   4   29  3
1   1   30  2
1   4   31  3
1   1   31  2
1   4   32  3
1   3   32  3
1   4   33  3
1   3   34  3
1   4   35  3
1   1   36  2
1   3   36  3
1   4   37  3
1   3   38  3
1   4   39  3
1   3   39  3
1   4   39  3
1   4   40  3
1   4   40  2
1   4   40  3
1   3   41  3
1   4   42  3
1   4   43  3
1   1   44  2
1   3   45  3
1   4   46  3
1   3   47  3
1   3   47  3
1   4   48  2
1   1   49  2
1   4   50  3
1   1   51  2
1   1   51  2
1   2   51  3
1   3   52  3
1   3   53  1
1   4   54  1
1   4   55  1
1   4   55  1
1   4   55  1
1   1   56  3
1   4   57  3
1   4   58  3
1   1   59  2
1   3   59  3
1   4   60  3
1   4   61  3
1   1   62  3
1   3   63  3
1   4   64  3
1   3   65  3
1   4   66  3
1   3   67  3
1   2   68  1
2   3   69  3
2   1   70  3
2   4   71  2
2   1   72  3
2   3   72  3
2   1   72  2

如果我运行我的代码的这个简短版本,我没有问题:

prevPersonTimeCategory <- array(-999, dim=c(3,3))
prevPersonTimeCategory[1,1] <- TgData$PersonID[1]
prevPersonTimeCategory[2,1] <- TgData$PersonID[1]
prevPersonTimeCategory[3,1] <- TgData$PersonID[1]
for(i in 2:nrow(TgData)) {
    if (TgData$timeCategory[i] == 1) {
        if (TgData$tour[i] == prevPersonTimeCategory[1,3]) {
            if (prevPersonTimeCategory[1,1] == TgData$PersonID[i]) {
                TgData$prevPurposeSameTimeCategoryDifferentTour[i] <- prevPersonTimeCategory[1,2]
                }
            else {
                TgData$prevPurposeSameTimeCategoryDifferentTour[i] <- -999
                prevPersonTimeCategory[1,1] <- TgData$PersonID[i]
                }   
            }
        }
    }

但如果我在这里添加更多行:

prevPersonTimeCategory <- array(-999, dim=c(3,3))
prevPersonTimeCategory[1,1] <- TgData$PersonID[1]
prevPersonTimeCategory[2,1] <- TgData$PersonID[1]
prevPersonTimeCategory[3,1] <- TgData$PersonID[1]
for(i in 2:nrow(TgData)) {
    if (TgData$timeCategory[i] == 1) {
        if (TgData$tour[i] == prevPersonTimeCategory[1,3]) {
            if (prevPersonTimeCategory[1,1] == TgData$PersonID[i]) {
                TgData$prevPurposeSameTimeCategoryDifferentTour[i] <- prevPersonTimeCategory[1,2]
                }
            else {
                TgData$prevPurposeSameTimeCategoryDifferentTour[i] <- -999
                prevPersonTimeCategory[1,1] <- TgData$PersonID[i]
                }   
            }
        else {
            if (prevPersonTimeCategory[1,1] == TgData$PersonID[i]) {
                prevPersonTimeCategory[1,3] <- TgData$tour[i]
                TgData$prevPurposeSameTimeCategoryDifferentTour[i] <- prevPersonTimeCategory[1,2]
                prevPersonTimeCategory[1,2] <- TgData$purpose[i]
                }
            else {
                TgData$prevPurposeSameTimeCategoryDifferentTour[i] <- -999
                prevPersonTimeCategory[1,1] <- TgData$PersonID[i]
                prevPersonTimeCategory[1,2] <- -999
                }
            }
        }
    }

错误回来了:

  

$<-.data.frame*tmp*中的错误,   “prevPurposeSameTimeCategoryDifferentTour”,:替换有18   行,数据有1150

1 个答案:

答案 0 :(得分:1)

创建一个新的空列,因为joran建议可行。

在开始循环之前运行它

TgData $ prevPurposeSameTimeCategoryDifferentTour&lt; - NA