我有车辆轨迹的数据框。这是一个快照:
> head(df)
vehicle frame globalx class velocity lane
1 2 43 6451214 2 37.76 2
2 2 44 6451217 2 37.90 2
3 2 45 6451220 2 38.05 2
4 2 46 6451223 2 38.18 2
5 2 47 6451225 2 38.32 2
6 2 48 6451228 2 38.44 2
其中,vehicle =车辆id(重复,因为在几个时间帧内观察到相同的车辆),frame =观察到它的时间帧的帧id,globalx =车辆前方中心的x坐标,class = type车辆(1 =摩托车,2 =汽车,3 =卡车),速度=以每秒英尺为单位的车辆速度,车道=车道号(有6个车道)。我想以下插图将更好地解释问题: “帧”表示十分之一秒,即一帧长0.1秒。在帧't'处车辆具有全局坐标x(t)并且在帧't-1'(之前0.1秒)处具有x(t-1)。参考位置是'U'(globalx = 6451179.1116),我只想要一个名为'u'的新列,其中车辆的globalx大于'U'和前一个参考坐标的行中的'是'该车辆的连续globalx坐标小于'U'处的参考坐标。这意味着如果df有100辆车,则'u'栏中将有100'是'因为每辆车都符合上述标准一次。我试图通过使用ifelse运行该函数来尝试这样做,并尝试使用for循环执行相同操作,但它对我不起作用。输出应该有一个新列:
vehicle frame globalx class velocity lane u
我尝试在内部使用ifelse
for循环和函数,但它对我不起作用。
答案 0 :(得分:1)
我假设数据框主要针对vehicle
排序,其次针对globalx
。如果不是,你可以通过:
idx <- with(df,order(vehicle,globalx))
df <- df[idx,]
现在,您可以使用以下矢量化操作执行它:
# example reference line
U <- 6451220
# adding the extra column
samecar <- duplicated(df[,"vehicle"])
passU <- c(FALSE,diff(sign(df[,"globalx"]-U+1e-10))>0)
df[,"u"] <- ifelse(samecar & passU,"yes","no")
答案 1 :(得分:0)
这是我的解决方案:
首先根据您提供的数据创建虚拟数据(我已将其保存到桌面上的data.txt
),复制数据,以便有两辆车具有相同的相同数据,但车辆ID不同&#39 S:
library(plyr)
df <- read.table("~/Desktop/data.txt",header=T)
df.B <- df; df.B$vehicle = 3 #For demonstration
df <- rbind(df,df.B); rm(df.B)
然后我们可以构建一个处理函数:
mvt <- function(xref=NULL,...,data=df){
if(!is.numeric(xref)) #Input must be numeric
stop("xref must be numeric",call.=F)
xref = xref[1]
##Split on vehicle and process.
ddply(data,"vehicle",function(d){
L = nrow(d) #Number of Rows
d$u = FALSE #Default to Not crossing
#One or more rows can be checked.
if(L == 1)
d$u = (d$globalx > xref)
else if(L > 1){
ix <- which(d$globalx[2:L] > xref & d$globalx[1:(L-1)] <= xref)
if(length(ix) > 0)
d$u[ix + 1] = TRUE
}
#done
return(d)
})
}
可以通过以下方式使用:
mvt(6451216)
mvt(6451217)