使用ddply中的变换在R中添加新列

问题描述:

我正在处理车辆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 $解决了这个问题。 –

对此,您不需要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