如何比较两个连续的行与R中的参考值?

时间:2014-02-21 03:10:17

标签: r

我有车辆轨迹的数据框。这是一个快照:

> 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个车道)。我想以下插图将更好地解释问题: enter image description here “帧”表示十分之一秒,即一帧长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循环和函数,但它对我不起作用。

2 个答案:

答案 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)