For循环创建一系列重复ID的块

For loop to create a sequence of blocks of repeated ids

我正在尝试根据类别列 (0/1) 创建一个新 ID(以下数据中的 id_2)。如果类别是 0,我只需要一个 NA,如果是 1,那么我需要为第一组“1”重复 1,然后为第二组“1”重复 2,依此类推。我需要为每个 id_1.

单独做

下面是我的数据示例、我的尝试和输出。 我还尝试在函数中包含一个 while 循环,但这没有帮助。

任何帮助将不胜感激。

我们可以使用data.table。将'data.frame'转换为'data.table'(setDT(df1)),按'id_1'分组,我们应用运行-length-id函数(rleid)到逻辑 vector (category ==0 & !is.na(category)),将 0' 转换为 NA (NA^(!i1)*i1)),然后将其更改为 factor 并获得 numeric 编码,分配 ( :=) 它作为 'id_new' 列。

library(data.table)
setDT(df1)[, id_new := {
        i1 <- category*rleid(category==0 & !is.na(category))
         as.numeric(factor(NA^(!i1)*i1))},
         by = id_1]
df1
#    id_1 category id_2 id_new
# 1:    1       NA   NA     NA
# 2:    1        1    1      1
# 3:    1        1    1      1
# 4:    1        1    1      1
# 5:    1        1    1      1
# 6:    1        0   NA     NA
# 7:    1        1    2      2
# 8:    1        1    2      2
# 9:    1        1    2      2
#10:    1        0   NA     NA
#11:    1        0   NA     NA
#12:    1        1    3      3
#13:    1        1    3      3
#14:    1        1    3      3
#15:    1        0   NA     NA
#16:    2        0   NA     NA
#17:    2        1    1      1
#18:    2        1    1      1
#19:    2        0   NA     NA
#20:    2        0   NA     NA
#21:    2        0   NA     NA
#22:    2        1    2      2
#23:    2        1    2      2
#24:    2        1    2      2
#25:    2        1    2      2
#26:    3        1    1      1
#27:    3        1    1      1
#28:    3        1    1      1
#29:    3        1    1      1
#30:    3        0   NA     NA
#31:    3        1    2      2
#32:    3        1    2      2
#33:    3        0   NA     NA
#34:    3        0   NA     NA
#35:    3        1    3      3
#36:    3        1    3      3
#37:    4        0   NA     NA
#38:    4        1    1      1
#39:    4        1    1      1
#40:    4        1    1      1
#41:    4        0   NA     NA
#42:    5        1    1      1
#43:    5        1    1      1
#44:    5        1    1      1