2011-08-30 128 views
1

我在包含跳轉的數據集上使用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

+3

TL;博士。嘗試創建新列並在所有循環之前用NAs填充它。 – joran

+0

爲了您'我的數據集'使用輸入,人們可以輕鬆地複製和粘貼它來複制,運行「dput(TgData)」。我運行了你的代碼,並沒有得到一個錯誤。如果我必須猜測你可能會出錯的地方,我想你可能需要在'assign'的左邊有一些'i'索引,因爲此刻你總是把結果放到同一個單元格中,或者是那個意圖?嘗試每次運行每個'如果'塊,以查看哪一個具體給你的錯誤。 – nzcoops

+1

可怕的問題。嘗試將代碼縮小到不起作用的最小版本。 – TMS

回答

1

創建一個新的空欄作爲喬蘭建議的作品。

運行這一點,你開始循環

TgData $ prevPurposeSameTimeCategoryDifferentTour <前 - NA

+0

即使在我爲循環添加新列之前,我如何獲得循環中的相同錯誤? – alily