我在包含跳转的数据集上使用R。每一行都是一次旅行(从A到B)。在每一行中,我知道个人身份(一个数字),旅行目的(1,2,3或4),时间类别(1,2或3)以及识别旅行的号码旅行已完成(旅行是一组旅行;所有这些旅行从A到A)。R中的数据帧和循环中的替换问题
我想创建一个新行:对于同一个人,在不同行程的同一时间类别中上一次行程的目的是什么。这个变量被称为“prevDistanceSameTimeCategoryDifferentTour”。
我有这样的错误:
Error in
$<-.data.frame
(*tmp*
,"prevDistanceSameTimeCategoryDifferentTour", : replacement has 2 rows, data has 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]等)。 然后,我只是读每行(为),并写一些条件(如果)。
我真的不明白我在哪里做错了。
我的数据集包含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
}
}
}
}
错误回来:
Error in
$<-.data.frame
(*tmp*
, "prevPurposeSameTimeCategoryDifferentTour", : replacement has 18 rows, data has 1150
TL;博士。尝试创建新列并在所有循环之前用NAs填充它。 – joran
为了您'我的数据集'使用输入,人们可以轻松地复制和粘贴它来复制,运行“dput(TgData)”。我运行了你的代码,并没有得到一个错误。如果我必须猜测你可能会出错的地方,我想你可能需要在'assign'的左边有一些'i'索引,因为此刻你总是把结果放到同一个单元格中,或者是那个意图?尝试每次运行每个'如果'块,以查看哪一个具体给你的错误。 – nzcoops
可怕的问题。尝试将代码缩小到不起作用的最小版本。 – TMS