【发布时间】: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
}
}
}
}
错误又回来了:
$<-.data.frame(*tmp*, "prevPurposeSameTimeCategoryDifferentTour", : 替换有 18 行,数据有 1150
【问题讨论】:
-
tl;博士。尝试在所有循环之前创建新列并用 NA 填充它。
-
对于您的“我的数据集”,请使用 dput,以便人们可以轻松地复制和粘贴它以进行复制,运行“dput(TgData)”。我运行了你的代码,没有收到错误。如果我不得不猜测您可能会出错的地方,我认为您可能需要在您的“分配”左侧使用一些“i”索引,因为此时您总是将结果放入相同的单元格中,还是那是意图?尝试一次运行每个“if”块,看看是哪一个特别给你错误。
-
可怕的问题。尝试将代码缩小到不起作用的最小版本。