2016-10-20 8 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。

私は、旅程がリンクされているかどうかを識別する5番目の列を作成するために基本ループを書いています。すなわち、2番目の旅にリンクした2番目の旅、2番目の旅にリンクした3番目の旅(1 =リンク、0 =以下の条件に基づいて、)リンクされていない:

  • jnysが同じ人のためのものと同じ日に行わ

  • 2バスの旅/ 2トラムjnys /バス、トラムjny /トラムとバス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、リンク済み、値= c(NA、1)): 置換行が2行あり、データが52231

これを約150行のテストデータセットで実行したとき、このエラーメッセージは表示されませんでした。私はそれがリンクされた列に関連していることを知っていますが、私はそれを解決する方法を完全に理解していません。

+0

あなたの中括弧と間違って何かがイマイチ? – Acarbalacar

+0

はいコードの 'for'ループの最後の'} 'がありません。 – timat

+0

@JassiL:私の答えはうまくいきませんか?あなたは別の何かを期待していたのですか? – timat

答えて

0

私はあなたと同じデータを使用していますが、コード(コピー貼り付け)は最初の行で動作していました。それを初期化する必要があります。 df$linked[1] <- 0

ここでは、ifとconditionの方が使いやすく(Rの方が速く、処理が速い) コメント(cat(i))も追加します。コメントを外すと、ループ内で何が起こっているのかを知ることができます。これは同じ日ではないよう

最後の事は、私が...、あなたは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これが機能する場合は、解決済みとマークする必要があります。あなたの質問については速度については(すでに私は、500万行ではないが)、パフォーマンスについての別の質問を投稿し、パッケージdata.tableを見て – timat

関連する問題