附加到具有条件的列

时间:2017-06-16 12:34:27

标签: r

对于给定的数据框:

id |conv   
 1 | 0 |  
 1 | 0 |   
 1 | 0 |   
 1 | 1 |   
 1 | 0 |  
 1 | 1 |  
 1 | 0 |  
 1 | 0 |  
 2 | 0 |  
 2 | 1 |  
 2 | 0 |  
 2 | 1 |  
 2 | 1 |  

conv只有两个值0或1.基本上当conv = 1且id相同时,应为后续id追加'_1'。然后对于相同的id,如果我们得到另一个conv = 1,'_2'应该附加到id。我需要在每次conv = 1时追加id并且id不会改变。我的输出应该是:

id |conv   
 1 | 0 |  
 1 | 0 |   
 1 | 0 |   
 1 | 1 |   
 1_1 | 0 |  
 1_1 | 1 |  
 1_2 | 0 |  
 1_2 | 0 |  
 2 | 0 |  
 2 | 1 |  
 2_1 | 0 |  
 2_1 | 1 |  
 2_2 | 0 |  
 2_2 | 0 |

由于数据很大,我不能用于循环。

2 个答案:

答案 0 :(得分:4)

一个想法是首先创建一个指标变量,它是convid的cumsum。我们在conv == 1时减1,只需将非零值粘贴到id

即可
ind <- with(df, ave(conv, id, FUN = cumsum))
ind[df$conv == 1] <- ind[df$conv == 1] - 1
df$id <- ifelse(ind == 0 , df$id, paste0(df$id, '_', ind))
df
#    id conv
#1    1    0
#2    1    0
#3    1    0
#4    1    1
#5  1_1    0
#6  1_1    1
#7  1_2    0
#8  1_2    0
#9    2    0
#10   2    1
#11 2_1    0
#12 2_1    1
#13 2_2    1

答案 1 :(得分:2)

我们可以使用ave

中的base R执行此操作
i1 <- with(df1, ave(conv==1, id, FUN = function(x) cumsum(dplyr::lag(x, default = FALSE))))
with(df1, ifelse(i1==0, id, paste(id, i1, sep="_")))