【问题标题】:Problem of data frame and replacement in a loop in RR中循环中的数据帧和替换问题
【发布时间】:2011-08-30 23:01:02
【问题描述】:

我在包含旅行的数据集上使用 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)并写一些条件(if)。

我真的不明白我在哪里做错了。

我的数据集包含 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
                }
            }
        }
    }

错误又回来了:

$&lt;-.data.frame(*tmp*, "prevPurposeSameTimeCategoryDifferentTour", : 替换有 18 行,数据有 1150

【问题讨论】:

  • tl;博士。尝试在所有循环之前创建新列并用 NA 填充它。
  • 对于您的“我的数据集”,请使用 dput,以便人们可以轻松地复制和粘贴它以进行复制,运行“dput(TgData)”。我运行了你的代码,没有收到错误。如果我不得不猜测您可能会出错的地方,我认为您可能需要在您的“分配”左侧使用一些“i”索引,因为此时您总是将结果放入相同的单元格中,还是那是意图?尝试一次运行每个“if”块,看看是哪一个特别给你错误。
  • 可怕的问题。尝试将代码缩小到不起作用的最小版本。

标签: r dataframe


【解决方案1】:

按照 joran 的建议创建一个新的空列。

在开始循环之前运行它

TgData$prevPurposeSameTimeCategoryDifferentTour

【讨论】:

  • 即使在 for 循环之前添加了带有 NA 的新列之后,如果我在 for 循环中遇到相同的错误,我该如何解决?
猜你喜欢
  • 1970-01-01
  • 2019-08-08
  • 1970-01-01
  • 2019-07-29
  • 2018-06-13
  • 1970-01-01
  • 2011-02-17
  • 2021-11-22
  • 2017-12-14
相关资源
最近更新 更多