数据框出错,替换有xx,数据有xx

时间:2016-10-20 11:12:08

标签: r loops

我希望有人可以帮助解决这个问题 - 我已经咀嚼了几个小时了!

我有一个名为' journeys'的数据框。如下所示,显示了客户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中编写了一个基本循环来创建第5列,用于标识旅程阶段是否已链接,即第2次旅程与第1次旅程相关联,第3次旅程与第2次旅程相关联(其中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

但是,当我尝试运行时,我不断收到以下错误消息:

  

$&lt; - 。data.frame( tmp ,&#34;已链接&#34;,值= c(NA,1))出错:     替换有2行,数据有52231

当我在大约150行的测试数据集上运行它时,我没有收到此错误消息。我知道它与链接列相关,但我不完全了解如何解决它。

1 个答案:

答案 0 :(得分:0)

我使用与您相同的数据,它正在使用您的代码(复制粘贴它),但第一行。你需要初始化它。 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

这里更好地使用if和条件(读取速度更快,R处理速度更快)。 我还添加了注释(cat(i)),如果你取消注释它,看看循环中发生了什么是有帮助的。

最后一件事,我认为你期待第8排的0而不是1,因为这不是同一天......

{{1}}