使用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
注意,“高压”是的名称我的原始数据集。你能指出代码中的问题吗?
答
对此,您不需要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 .
摆脱'HV $'的;否则'transform'会尝试从你的数据框中插入整个列,而不是'ddply'作为第一个参数给出的部分。 – BrodieG
@BrodieG谢谢!删除hv $解决了这个问题。 –