我希望有人可以帮助解决这个问题 - 我已经咀嚼了几个小时了!
我有一个名为' 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行的测试数据集上运行它时,我没有收到此错误消息。我知道它与链接列相关,但我不完全了解如何解决它。
答案 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}}