2014-02-21 34 views
2

我有車輛軌跡的數據幀。這裏的一個快照:如何比較兩個連續的行與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 

其中,車輛=車輛ID(重複因爲同一車輛在若干時間幀觀察到的),幀=時間的幀的幀ID,其中可以觀察到,globalx前方= x座標車輛類型=車輛類型(1 =摩托車,2 =車,3 =卡車),速度=車輛速度(英尺/秒),車道=車道數量(有6車道)。我認爲下面的例子可以更好地解釋這個問題: enter image description here '幀'代表十分之一秒,即一幀長0.1秒。在幀't'處,車輛具有全局x座標x(t)並且在幀't-1'(前0.1秒)處具有x(t-1)。參考位置是'U'(globalx = 6451179.1116),我只是想要一個名爲'u'的df中的新列,其中在車輛的globalx大於'U'處的參考座標的行中具有'是' 'U'時,該車輛的連續globalx座標小於參考座標。這意味着如果df有100輛車,那麼'u'欄中會有100'yes',因爲每輛車都會符合上述標準一次。我試圖通過使用ifelse運行該函數來做到這一點,並試圖使用for循環做同樣的事情,但它不適用於我。輸出應該有一個新的列:

vehicle frame globalx class velocity lane u 

我嘗試使用ifelse在for循環和功能,但它並沒有爲我工作。

+0

'ifelse'被量化。不需要'爲'。 '在(df,ü<- globalx > your.coord)' – mlt

+0

@mlt有2個條件,globalx在't'幀,例如幀45應該大於參考座標u AND,並且在連續的前一幀44處,globalx應該小於圖像中所示的參考座標。我如何指定R應該查看連續幀?我嘗試了globalx [i]> 6451179.1116&globalx [i-1] <6451179.116,但它不起作用。 –

+0

類似'ref c(diff(globalx),0))''。在'c()'中檢查參數順序。請注意,如果您有不同的車輛ID,最好使用plyr的'ddply'或類似的方法來完成。 – mlt

回答

1

我假定該數據幀被分類爲globalx主要用於vehicle和二次。如果不是的話,你可以做到這一點:

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") 
+0

謝謝!有效。 –

0

這裏是我的解決方案:

首先創建虛擬數據,根據您提供的數據(我把它保存到data.txt我的桌面上),複製數據,這樣有兩個汽車行駛相同的相同數據,但不同的車輛ID的:

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)