2016-10-20 54 views
-1

我希望有人可以幫助解決這個問題 - 我一直在咀嚼它幾個小時!數據幀中的錯誤,更換有xx,數據有xx

我有一個名爲「旅程」爲遵循一個數據幀顯示了客戶ID,他們的旅行方式和行程日期開始時間:

ID  | Date  | Mode | Time 
------ | --------- | ------- | ----- 
1234 | 12/10/16 | Bus  | 120 
1234 | 12/10/16 | Bus  | 130 
1234 | 12/10/16 | Bus  | 290 
1234 | 12/10/16 | Train | 310 
1234 | 12/10/16 | Bus  | 330 
4567 | 12/10/16 | Bus  | 220 
4567 | 12/10/16 | Tram | 230 
4567 | 13/10/16 | Bus  | 290 
4567 | 13/10/16 | Bus  | 450 
4567 | 14/10/16 | Train | 1000 

因此,對12/10,客戶1234做4路公交車jnys和1火車jny。

我已經寫了一個基本循環在r中創建第五列,用於標識旅程階段是否已鏈接,即第二旅程鏈接到第一旅程,第三旅程鏈接到第二旅程(其中1 =已鏈接,0 =沒有鏈接),基於以下的條件:

  • 的jnys是同一人,併發生在同一天

  • 2巴士旅程/ 2電車jnys /一個公共汽車和電車JNY /有軌電車和公共汽車在60分鐘之內(因此彼此之間60分鐘內的巴士和火車旅程不會被鏈接)。代碼如下:

    df <- read.table("Journeys.txt", header=TRUE, sep=",") 
    
    for (i in 2:dim(df)[1]) { 
    
        if ((df$ID[i]==df$ID[i-1]) 
    
        & (df$Date[i]==df$Date[i-1]) 
    
        & ((df$Mode[i]=='Bus' & df$Mode[i-1]=='Bus')| 
         (df$Mode[i]=='Bus' & df$Mode[i-1]=='Tram')| 
         (df$Mode[i]=='Tram' & df$Mode[i-1]=='Bus')| 
         (df$Mode[i]=='Tram' & df$Mode[i-1]=='Tram')) 
    
        & (df$Time[i]-df$Time[i-1]<60)) 
    
        {df$linked[i] <- 1} 
    
         else {df$linked[i] <- 0} 
    

這應該給我下面的輸出:

ID  | Date  | Mode | Time | Linked 
------ | --------- | ------- | ----- | ----- 
1234 | 12/10/16 | Bus  | 120 | 0 
1234 | 12/10/16 | Bus  | 130 | 1 
1234 | 12/10/16 | Bus  | 290 | 0 
1234 | 12/10/16 | Train | 310 | 0 
1234 | 12/10/16 | Bus  | 330 | 0 
4567 | 12/10/16 | Bus  | 220 | 0 
4567 | 12/10/16 | Tram | 230 | 1 
4567 | 13/10/16 | Bus  | 290 | 0 
4567 | 13/10/16 | Bus  | 450 | 0 
4567 | 14/10/16 | Train | 1000 | 0 

然而,當我嘗試運行此我不斷收到以下錯誤信息:

錯誤$ < -.data.frame(tmp,「linked」,value = c(NA,1)): 替換有2行,數據有52231

當我在大約150行的測試數據集上運行這個時,我沒有得到這個錯誤信息。我知道它與鏈接列有關,但我不完全明白如何解決它。

+0

心不是有什麼問題你大括號? – Acarbalacar

+0

是的代碼中循環'for'的最後一個'}'丟失。 – timat

+0

@JassiL:我的回答不起作用?你還在等別的東西? – timat

回答

0

我使用與您相同的數據,它使用您的代碼(複製粘貼它),但第一行。你需要初始化它。 df$linked[1] <- 0

這裏更好地使用了if和條件(更快的讀取和更快的處理R)。 我也添加了評論(貓(我)),如果你取消註釋它,這是有用的,看看循環中發生了什麼。

最後一件事,我想您是第8行期待一個0而不是1,因爲這是不一樣的一天......

df<- read.csv("train.csv", sep=",") 

df$linked <- 0 
for (i in 2:dim(df)[1]) { 

    if (df$ID[i]==df$ID[i-1]) { 
    #cat(i) 
    if (df$Date[i]==df$Date[i-1]){ 
     #cat(i) 
     if (df$Time[i]-df$Time[i-1]<60) { 
     #cat(i) 
     if (df$Mode[i]=="Bus" & df$Mode[i-1] %in% c("Bus", "Tram")) { 
      #cat(i) 
      df$linked[i] <- 1 
     } else { 
      if (df$Mode[i]=="Tram" & df$Mode[i-1] %in% c("Bus", "Tram")) { 
      df$linked[i] <- 1 
      #cat(i) 
      } 
     } 
     } 
    } 
    } 
} 

    ID  Date Mode Time linked 
1 1234 12/10/2016 Bus 120  0 
2 1234 12/10/2016 Bus 130  1 
3 1234 12/10/2016 Bus 290  0 
4 1234 12/10/2016 Train 310  0 
5 1234 12/10/2016 Bus 330  0 
6 4567 12/10/2016 Bus 220  0 
7 4567 12/10/2016 Tram 230  1 
8 4567 13/10/2016 Bus 290  0 
9 4567 13/10/2016 Bus 450  0 
10 4567 14/10/2016 Train 1000  0 
+0

Timat,感謝您的迴應。這工作,但似乎需要數小時!我正在穿過一張有500萬行的桌子。有什麼辦法可以加快速度嗎? – JassiL

+0

@JassilL如果這可行,你應該把它標記爲已解決。如果你的問題是關於速度的話(我已經這樣做了,儘管不是5百萬行),但還是會提出另一個關於性能的問題,並查看包data.table – timat

相關問題