2016-10-20 72 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

相关问题