2016-10-20 4 views
-1

Я надеюсь, что кто-то может помочь с этой проблемой - я пережевывал ее в течение нескольких часов!Ошибка в фрейме данных, замена имеет xx, данные имеют xx

У меня есть фрейм данных под названием «» путешествия следующим образом, который показывает идентификатор клиента, даты их путешествия, режима и начало поездки времени:

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-м путешествием, третье путешествие, связанное со вторым путешествием (где 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, "linked", value = c (NA, 1)): замена имеет 2 строки, данные имеют 52231

Когда я запускал это на тестовом наборе данных около 150 строк, я не получил это сообщение об ошибке. Я знаю, что это связано с связанным столбцом, но я не совсем понимаю, как его разрешить.

+0

Isnt там что-то не так с вашей фигурные скобки? – Acarbalacar

+0

Да, последний '}' цикла 'for' на вашем коде отсутствует. – timat

+0

@ JassiL: мой ответ не работает? вы ожидали чего-то еще? – timat

ответ

0

Я использую те же данные, что и вы, и он работал с вашим кодом (скопируйте его), но в первую строку. вам необходимо инициализировать его. df$linked[1] <- 0

Здесь лучше использовать if и условие (быстрее читать и быстрее обрабатывать R). Я также добавляю комментарий (cat (i)), если вы раскомментируете его, полезно посмотреть, что происходит в цикле.

Последняя вещь, я думаю, что вы ожидаете 0, а не 1 к 8-му ряду, так как это не в тот же день ...

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, спасибо за ответ. Это работает, но, похоже, уходит много часов! Я бегу через таблицу с 5миллионными рядами. Есть ли способ ускорить это? – JassiL

+0

@JassilL Если это работает, вы должны пометить его как разрешенное. Если ваш вопрос, если о скорости (что я сделал уже, а не за 5 миллионов строк), задайте другой вопрос о производительности и посмотрите на пакет data.table – timat

Смежные вопросы