【问题标题】:Adding a new column using transform in ddply in R在 R 的 ddply 中使用转换添加新列
【发布时间】:2014-03-03 21:16:13
【问题描述】:

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

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

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

【问题讨论】:

  • 摆脱hv$;否则transform 将尝试插入数据框中的整个列,而不是ddply 作为第一个参数给出的部分。
  • @BrodieG 谢谢!删除 hv$ 解决了这个问题。

标签: r plyr


【解决方案1】:

你不需要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      .

【讨论】:

  • 我认为问题在于有多辆汽车,因此您需要某种形式的汽车拆分(使用ave,这就是我在这里要做的,或者使用 plyr/data.table /dplyr 包)。不过我可能是误会了。无论如何 +1 让你达到 10k ;)
  • 因为有多辆车,我确实需要拆分,这就是使用 ddply 的原因。还是谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-26
  • 1970-01-01
相关资源
最近更新 更多