在R中使用ddply中的transform添加新列

时间:2014-03-03 21:16:13

标签: r plyr

我正在处理车辆ID随时间重复的数据集。单个车辆的示例如下所示:

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

我想添加一个新列,其中'yes'表示泳道有变化,“。”意味着没有换道。我使用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

请注意,'hv'是我原始数据集的名称。你能指出代码中的问题吗?

1 个答案:

答案 0 :(得分: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      .