簡體   English   中英

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

[英]Adding a new column using transform in ddply in R

我正在使用一個數據集,其中車輛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”是我原始數據集的名稱。 您能否指出代碼中的問題?

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM