对于给定的数据框:
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 |
由于数据很大,我不能用于循环。
答案 0 :(得分:4)
一个想法是首先创建一个指标变量,它是conv
每id
的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="_")))