2014-03-03 114 views
1

我正在處理車輛ID隨時間重複出現的數據集。單一車輛的一個例子是類似下面的東西:使用ddply中的變換在R中添加新列

df <- data.frame(veh = rep(2,15), lane=c(rep(3,5), rep(4,5), rep(5,5)), frame=1:15) 

我想添加一個新列在其中「是」意味着有車道和變化「」意味着沒有換道。我使用ddply如下:

> ddply(df, 'veh', transform,change=c(NA,ifelse(diff(df$lane)!=0,"yes","."))) 
    veh lane frame change 
1 2 3  1 <NA> 
2 2 3  2  . 
3 2 3  3  . 
4 2 3  4  . 
5 2 3  5  . 
6 2 4  6 yes 
7 2 4  7  . 
8 2 4  8  . 
9 2 4  9  . 
10 2 4 10  . 
11 2 5 11 yes 
12 2 5 12  . 
13 2 5 13  . 
14 2 5 14  . 
15 2 5 15  . 

這給了我所需的輸出。但是,在我的原始數據集中,有更多的車輛ID(DF中的'veh')。第一車輛ID「14」重複455次和行的總數是23454.當我使用的原始數據集相同的功能我得到以下錯誤:

> hv1 <- ddply(hv, 'Vehicle.ID', transform,change=c(NA,ifelse(diff(hv$Lane)!=0,"yes","."))) 
Error in data.frame(list(Vehicle.ID = c(14L, 14L, 14L, 14L, 14L, 14L, : 
    arguments imply differing number of rows: 455, 23454 

注意,「高壓」是的名稱我的原始數據集。你能指出代碼中的問題嗎?

+0

擺脫'HV $'的;否則'transform'會嘗試從你的數據框中插入整個列,而不是'ddply'作爲第一個參數給出的部分。 – BrodieG

+0

@BrodieG謝謝!刪除hv $解決了這個問題。 –

回答

2

對此,您不需要ddply,因爲它是一個簡單的矢量問題。嘗試使用diff和簡單的索引:

do.call('rbind', lapply(split(df, df$veh), function(z){ 
    z$change <- c(NA, diff(z$lane)) 
    z$change[z$change==1]<-'yes' 
    z$change[z$change==0]<-'.' 
})) 

結果:

> df 
    veh lane frame change 
1 2 3  1 <NA> 
2 2 3  2  . 
3 2 3  3  . 
4 2 3  4  . 
5 2 3  5  . 
6 2 4  6 yes 
7 2 4  7  . 
8 2 4  8  . 
9 2 4  9  . 
10 2 4 10  . 
11 2 5 11 yes 
12 2 5 12  . 
13 2 5 13  . 
14 2 5 14  . 
15 2 5 15  . 
+0

我認爲問題是有多輛車,所以你需要開車(或者'ave',這是我在這裏要做的,或者與plyr/data.table/dplyr包)的某種分割。但我可能會誤解。 +1無論如何,讓你到10K;) – BrodieG

+0

由於多輛車,我確實需要分裂,這就是爲什麼使用ddply。不管怎麼說,還是要謝謝你。 –

+0

有道理。查看修改。 – Thomas