如何为r中没有NA值的每n行创建一个分组列

anauzrmj  于 2022-12-06  发布在  其他
关注(0)|答案(1)|浏览(101)

我有一个 Dataframe ,如下所示:

df <- structure(list(id = c("A", "A", "A", "A", "A", "A", "A", "A", 
"A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", 
"B", "B", "B", "B", "B", "B", "B", "B", "B", "B", "B", "B", "B", 
"B", "B", "B", "B", "B", "B", "B", "B", "C", "C", "C", "C", "C", 
"C", "C", "C", "C", "C", "C", "C", "C", "C", "C", "C", "C", "C", 
"C", "C", "C", "D", "D", "D", "D", "D", "D", "D", "D", "D", "D", 
"D", "D", "D", "D", "D", "D", "D", "D", "D", "D", "D", "E", "E", 
"E", "E", "E", "E", "E", "E", "E", "E", "E", "E", "E", "E", "E", 
"E", "E", "E", "E", "E", "E", "F", "F", "F", "F", "F", "F", "F", 
"F", "F", "F", "F", "F", "F", "F", "F", "F", "F", "F", "F", "F", 
"F", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", 
"G", "G", "G", "G", "G", "G", "G", "G", "G", "H", "H", "H", "H", 
"H", "H", "H", "H", "H", "H", "H", "H", "H", "H", "H", "H", "H", 
"H", "H", "H", "H", "I", "I", "I", "I", "I", "I", "I", "I", "I", 
"I", "I", "I", "I", "I", "I", "I", "I", "I", "I", "I", "I"), 
    category = c("Banana", "Apple", "Orange", "Banana", "Apple", 
    "Orange", "Banana", "Apple", "Orange", "Banana", "Apple", 
    "Orange", "Banana", "Apple", "Orange", "Banana", "Apple", 
    "Orange", "Banana", "Apple", "Orange", "Banana", "Apple", 
    "Orange", "Banana", "Apple", "Orange", "Banana", "Apple", 
    "Orange", "Banana", "Apple", "Orange", "Banana", "Apple", 
    "Orange", "Banana", "Apple", "Orange", "Banana", "Apple", 
    "Orange", "Banana", "Apple", "Orange", "Banana", "Apple", 
    "Orange", "Banana", "Apple", "Orange", "Banana", "Apple", 
    "Orange", "Banana", "Apple", "Orange", "Banana", "Apple", 
    "Orange", "Banana", "Apple", "Orange", "Banana", "Apple", 
    "Orange", "Banana", "Apple", "Orange", "Banana", "Apple", 
    "Orange", "Banana", "Apple", "Orange", "Banana", "Apple", 
    "Orange", "Banana", "Apple", "Orange", "Banana", "Apple", 
    "Orange", "Banana", "Apple", "Orange", "Banana", "Apple", 
    "Orange", "Banana", "Apple", "Orange", "Banana", "Apple", 
    "Orange", "Banana", "Apple", "Orange", "Banana", "Apple", 
    "Orange", "Banana", "Apple", "Orange", "Banana", "Apple", 
    "Orange", "Banana", "Apple", "Orange", "Banana", "Apple", 
    "Orange", "Banana", "Apple", "Orange", "Banana", "Apple", 
    "Orange", "Banana", "Apple", "Orange", "Banana", "Apple", 
    "Orange", "Banana", "Apple", "Orange", "Banana", "Apple", 
    "Orange", "Banana", "Apple", "Orange", "Banana", "Apple", 
    "Orange", "Banana", "Apple", "Orange", "Banana", "Apple", 
    "Orange", "Banana", "Apple", "Orange", "Banana", "Apple", 
    "Orange", "Banana", "Apple", "Orange", "Banana", "Apple", 
    "Orange", "Banana", "Apple", "Orange", "Banana", "Apple", 
    "Orange", "Banana", "Apple", "Orange", "Banana", "Apple", 
    "Orange", "Banana", "Apple", "Orange", "Banana", "Apple", 
    "Orange", "Banana", "Apple", "Orange", "Banana", "Apple", 
    "Orange", "Banana", "Apple", "Orange", "Banana", "Apple", 
    "Orange", "Banana", "Apple", "Orange"), number = structure(c(1L, 
    1L, 1L, 2L, 2L, 2L, 3L, 3L, 3L, 4L, 4L, 4L, 5L, 5L, 5L, 6L, 
    6L, 6L, 7L, 7L, 7L, 1L, 1L, 1L, 2L, 2L, 2L, 3L, 3L, 3L, 4L, 
    4L, 4L, 5L, 5L, 5L, 6L, 6L, 6L, 7L, 7L, 7L, 1L, 1L, 1L, 2L, 
    2L, 2L, 3L, 3L, 3L, 4L, 4L, 4L, 5L, 5L, 5L, 6L, 6L, 6L, 7L, 
    7L, 7L, 1L, 1L, 1L, 2L, 2L, 2L, 3L, 3L, 3L, 4L, 4L, 4L, 5L, 
    5L, 5L, 6L, 6L, 6L, 7L, 7L, 7L, 1L, 1L, 1L, 2L, 2L, 2L, 3L, 
    3L, 3L, 4L, 4L, 4L, 5L, 5L, 5L, 6L, 6L, 6L, 7L, 7L, 7L, 1L, 
    1L, 1L, 2L, 2L, 2L, 3L, 3L, 3L, 4L, 4L, 4L, 5L, 5L, 5L, 6L, 
    6L, 6L, 7L, 7L, 7L, 1L, 1L, 1L, 2L, 2L, 2L, 3L, 3L, 3L, 4L, 
    4L, 4L, 5L, 5L, 5L, 6L, 6L, 6L, 7L, 7L, 7L, 1L, 1L, 1L, 2L, 
    2L, 2L, 3L, 3L, 3L, 4L, 4L, 4L, 5L, 5L, 5L, 6L, 6L, 6L, 7L, 
    7L, 7L, 1L, 1L, 1L, 2L, 2L, 2L, 3L, 3L, 3L, 4L, 4L, 4L, 5L, 
    5L, 5L, 6L, 6L, 6L, 7L, 7L, 7L), levels = c("1", "2", "3", 
    "4", "5", "6", "7"), class = "factor"), value = c(NA, 626.003642929148, 
    14.8530720820503, 1084.38927965752, 471.655282952508, 64.7236912331857, 
    776.07706769966, 396.916793965147, 54.4855105782135, NA, 
    NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 545.062982509092, 
    1.91732773771467, NA, NA, NA, NA, NA, NA, NA, NA, NA, 394.894986584073, 
    195.280219395579, 7.64479280434642, 22.0315874609581, NA, 
    NA, NA, NA, NA, NA, NA, NA, 1080.64933432694, 805.86292498854, 
    13.482712704827, NA, NA, NA, NA, NA, NA, 1245.98805385198, 
    460.473209104431, 7.63424473634, 890.478501410027, 660.395220925587, 
    9.17592533879766, NA, 299.959907306427, 11.4907173073867, 
    NA, 491.805140195306, 177.400798058143, NA, NA, NA, NA, NA, 
    NA, 184.289228960705, 771.021642313767, 6.31043426543333, 
    281.726609330022, NA, NA, NA, NA, NA, NA, NA, NA, NA, 509.378049364324, 
    278.038058491692, 527.80894112378, 975.632789695641, 228.599356169827, 
    760.529109540798, 25.8508640237331, 208.36160360409, NA, 
    NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 857.05785408852, 
    348.960106993208, 95.34862608411, NA, NA, NA, NA, NA, NA, 
    NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 643.00490054136, 
    176.787378197281, 454.641131289842, 875.117995998053, 89.4833304141165, 
    854.237890262158, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
    NA, NA, NA, NA, NA, 657.837193971776, 201.407816618736, 218.002918108005, 
    981.375399584459, 252.181299279728, 254.482264508715, NA, 
    NA, 237.354256272709, NA, NA, 346.67665285344, NA, NA, NA, 
    NA, NA, NA, NA, NA, NA, NA, NA, 207.808025637129, 418.411113648792, 
    30.3048309454833, 990.842297838783, 560.436400795975, 27.8512837727917, 
    1024.57867280143, 568.935110651167, 26.6536802259542, 887.976034157129, 
    NA, NA, NA, NA, NA, NA, NA, NA)), class = c("grouped_df", 
"tbl_df", "tbl", "data.frame"), row.names = c(NA, -189L), groups = structure(list(
    id = c("A", "A", "A", "A", "A", "A", "A", "B", "B", "B", 
    "B", "B", "B", "B", "C", "C", "C", "C", "C", "C", "C", "D", 
    "D", "D", "D", "D", "D", "D", "E", "E", "E", "E", "E", "E", 
    "E", "F", "F", "F", "F", "F", "F", "F", "G", "G", "G", "G", 
    "G", "G", "G", "H", "H", "H", "H", "H", "H", "H", "I", "I", 
    "I", "I", "I", "I", "I"), number = structure(c(1L, 2L, 3L, 
    4L, 5L, 6L, 7L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 1L, 2L, 3L, 4L, 
    5L, 6L, 7L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 1L, 2L, 3L, 4L, 5L, 
    6L, 7L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 1L, 2L, 3L, 4L, 5L, 6L, 
    7L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 1L, 2L, 3L, 4L, 5L, 6L, 7L
    ), levels = c("1", "2", "3", "4", "5", "6", "7"), class = "factor"), 
    .rows = structure(list(1:3, 4:6, 7:9, 10:12, 13:15, 16:18, 
        19:21, 22:24, 25:27, 28:30, 31:33, 34:36, 37:39, 40:42, 
        43:45, 46:48, 49:51, 52:54, 55:57, 58:60, 61:63, 64:66, 
        67:69, 70:72, 73:75, 76:78, 79:81, 82:84, 85:87, 88:90, 
        91:93, 94:96, 97:99, 100:102, 103:105, 106:108, 109:111, 
        112:114, 115:117, 118:120, 121:123, 124:126, 127:129, 
        130:132, 133:135, 136:138, 139:141, 142:144, 145:147, 
        148:150, 151:153, 154:156, 157:159, 160:162, 163:165, 
        166:168, 169:171, 172:174, 175:177, 178:180, 181:183, 
        184:186, 187:189), ptype = integer(0), class = c("vctrs_list_of", 
    "vctrs_vctr", "list"))), class = c("tbl_df", "tbl", "data.frame"
), row.names = c(NA, -63L), .drop = TRUE))

正如您所看到的,在values列中有许多示例都有NA。(在每个id内),其中我取一个3行窗口(第1步,共1步),并添加分组标签(在本例中标记为ID_group_groupnumber)。重要的是,每个其它类别(“苹果”、“香蕉”和“橙子”)的一个单个值需要出现在最后一组中。
输出应该如下所示,其中组只能是3行,并且每次此规则不适用时,都会使用NA值作为标签。

df <- structure(list(id = c("A", "A", "A", "A", "A", "A", "A", "A", 
"A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", 
"B", "B", "B", "B", "B", "B", "B", "B", "B", "B", "B", "B", "B", 
"B", "B", "B", "B", "B", "B", "B", "B", "C", "C", "C", "C", "C", 
"C", "C", "C", "C", "C", "C", "C", "C", "C", "C", "C", "C", "C", 
"C", "C", "C", "D", "D", "D", "D", "D", "D", "D", "D", "D", "D", 
"D", "D", "D", "D", "D", "D", "D", "D", "D", "D", "D", "E", "E", 
"E", "E", "E", "E", "E", "E", "E", "E", "E", "E", "E", "E", "E", 
"E", "E", "E", "E", "E", "E", "F", "F", "F", "F", "F", "F", "F", 
"F", "F", "F", "F", "F", "F", "F", "F", "F", "F", "F", "F", "F", 
"F", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", "G", 
"G", "G", "G", "G", "G", "G", "G", "G", "G", "H", "H", "H", "H", 
"H", "H", "H", "H", "H", "H", "H", "H", "H", "H", "H", "H", "H", 
"H", "H", "H", "H", "I", "I", "I", "I", "I", "I", "I", "I", "I", 
"I", "I", "I", "I", "I", "I", "I", "I", "I", "I", "I", "I"), 
    category = c("Banana", "Apple", "Orange", "Banana", "Apple", 
    "Orange", "Banana", "Apple", "Orange", "Banana", "Apple", 
    "Orange", "Banana", "Apple", "Orange", "Banana", "Apple", 
    "Orange", "Banana", "Apple", "Orange", "Banana", "Apple", 
    "Orange", "Banana", "Apple", "Orange", "Banana", "Apple", 
    "Orange", "Banana", "Apple", "Orange", "Banana", "Apple", 
    "Orange", "Banana", "Apple", "Orange", "Banana", "Apple", 
    "Orange", "Banana", "Apple", "Orange", "Banana", "Apple", 
    "Orange", "Banana", "Apple", "Orange", "Banana", "Apple", 
    "Orange", "Banana", "Apple", "Orange", "Banana", "Apple", 
    "Orange", "Banana", "Apple", "Orange", "Banana", "Apple", 
    "Orange", "Banana", "Apple", "Orange", "Banana", "Apple", 
    "Orange", "Banana", "Apple", "Orange", "Banana", "Apple", 
    "Orange", "Banana", "Apple", "Orange", "Banana", "Apple", 
    "Orange", "Banana", "Apple", "Orange", "Banana", "Apple", 
    "Orange", "Banana", "Apple", "Orange", "Banana", "Apple", 
    "Orange", "Banana", "Apple", "Orange", "Banana", "Apple", 
    "Orange", "Banana", "Apple", "Orange", "Banana", "Apple", 
    "Orange", "Banana", "Apple", "Orange", "Banana", "Apple", 
    "Orange", "Banana", "Apple", "Orange", "Banana", "Apple", 
    "Orange", "Banana", "Apple", "Orange", "Banana", "Apple", 
    "Orange", "Banana", "Apple", "Orange", "Banana", "Apple", 
    "Orange", "Banana", "Apple", "Orange", "Banana", "Apple", 
    "Orange", "Banana", "Apple", "Orange", "Banana", "Apple", 
    "Orange", "Banana", "Apple", "Orange", "Banana", "Apple", 
    "Orange", "Banana", "Apple", "Orange", "Banana", "Apple", 
    "Orange", "Banana", "Apple", "Orange", "Banana", "Apple", 
    "Orange", "Banana", "Apple", "Orange", "Banana", "Apple", 
    "Orange", "Banana", "Apple", "Orange", "Banana", "Apple", 
    "Orange", "Banana", "Apple", "Orange", "Banana", "Apple", 
    "Orange", "Banana", "Apple", "Orange", "Banana", "Apple", 
    "Orange", "Banana", "Apple", "Orange"), number = structure(c(1L, 
    1L, 1L, 2L, 2L, 2L, 3L, 3L, 3L, 4L, 4L, 4L, 5L, 5L, 5L, 6L, 
    6L, 6L, 7L, 7L, 7L, 1L, 1L, 1L, 2L, 2L, 2L, 3L, 3L, 3L, 4L, 
    4L, 4L, 5L, 5L, 5L, 6L, 6L, 6L, 7L, 7L, 7L, 1L, 1L, 1L, 2L, 
    2L, 2L, 3L, 3L, 3L, 4L, 4L, 4L, 5L, 5L, 5L, 6L, 6L, 6L, 7L, 
    7L, 7L, 1L, 1L, 1L, 2L, 2L, 2L, 3L, 3L, 3L, 4L, 4L, 4L, 5L, 
    5L, 5L, 6L, 6L, 6L, 7L, 7L, 7L, 1L, 1L, 1L, 2L, 2L, 2L, 3L, 
    3L, 3L, 4L, 4L, 4L, 5L, 5L, 5L, 6L, 6L, 6L, 7L, 7L, 7L, 1L, 
    1L, 1L, 2L, 2L, 2L, 3L, 3L, 3L, 4L, 4L, 4L, 5L, 5L, 5L, 6L, 
    6L, 6L, 7L, 7L, 7L, 1L, 1L, 1L, 2L, 2L, 2L, 3L, 3L, 3L, 4L, 
    4L, 4L, 5L, 5L, 5L, 6L, 6L, 6L, 7L, 7L, 7L, 1L, 1L, 1L, 2L, 
    2L, 2L, 3L, 3L, 3L, 4L, 4L, 4L, 5L, 5L, 5L, 6L, 6L, 6L, 7L, 
    7L, 7L, 1L, 1L, 1L, 2L, 2L, 2L, 3L, 3L, 3L, 4L, 4L, 4L, 5L, 
    5L, 5L, 6L, 6L, 6L, 7L, 7L, 7L), levels = c("1", "2", "3", 
    "4", "5", "6", "7"), class = "factor"), value = c(NA, 626.003642929148, 
    14.8530720820503, 1084.38927965752, 471.655282952508, 64.7236912331857, 
    776.07706769966, 396.916793965147, 54.4855105782135, NA, 
    NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 545.062982509092, 
    1.91732773771467, NA, NA, NA, NA, NA, NA, NA, NA, NA, 394.894986584073, 
    195.280219395579, 7.64479280434642, 22.0315874609581, NA, 
    NA, NA, NA, NA, NA, NA, NA, 1080.64933432694, 805.86292498854, 
    13.482712704827, NA, NA, NA, NA, NA, NA, 1245.98805385198, 
    460.473209104431, 7.63424473634, 890.478501410027, 660.395220925587, 
    9.17592533879766, NA, 299.959907306427, 11.4907173073867, 
    NA, 491.805140195306, 177.400798058143, NA, NA, NA, NA, NA, 
    NA, 184.289228960705, 771.021642313767, 6.31043426543333, 
    281.726609330022, NA, NA, NA, NA, NA, NA, NA, NA, NA, 509.378049364324, 
    278.038058491692, 527.80894112378, 975.632789695641, 228.599356169827, 
    760.529109540798, 25.8508640237331, 208.36160360409, NA, 
    NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 857.05785408852, 
    348.960106993208, 95.34862608411, NA, NA, NA, NA, NA, NA, 
    NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 643.00490054136, 
    176.787378197281, 454.641131289842, 875.117995998053, 89.4833304141165, 
    854.237890262158, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
    NA, NA, NA, NA, NA, 657.837193971776, 201.407816618736, 218.002918108005, 
    981.375399584459, 252.181299279728, 254.482264508715, NA, 
    NA, 237.354256272709, NA, NA, 346.67665285344, NA, NA, NA, 
    NA, NA, NA, NA, NA, NA, NA, NA, 207.808025637129, 418.411113648792, 
    30.3048309454833, 990.842297838783, 560.436400795975, 27.8512837727917, 
    1024.57867280143, 568.935110651167, 26.6536802259542, 887.976034157129, 
    NA, NA, NA, NA, NA, NA, NA, NA), grouping = c(NA, "A_group1", 
    "A_group1", "A_group1", "A_group2", "A_group2", "A_group2", 
    NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
    NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, "B_group1", "B_group1", 
    "B_group1", NA, NA, NA, NA, NA, NA, NA, NA, NA, "C_group1", 
    "C_group1", "C_group1", NA, NA, NA, NA, NA, NA, "C_group2", 
    "C_group2", "C_group2", "C_group3", "C_group3", "C_group3", 
    NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, "D_group1", 
    "D_group1", "D_group1", NA, NA, NA, NA, NA, NA, NA, NA, NA, 
    NA, "E_group1", "E_group1", "E_group1", "E_group2", "E_group2", 
    "E_group2", NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
    NA, NA, NA, "F_group1", "F_group1", "F_group1", NA, NA, NA, 
    NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
    "G_group1", "G_group1", "G_group1", "G_group2", "G_group2", 
    "G_group2", NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
    NA, NA, NA, "H_group1", "H_group1", "H_group1", "H_group2", 
    "H_group2", "H_group2", NA, NA, NA, NA, NA, NA, NA, NA, NA, 
    NA, NA, NA, NA, NA, NA, NA, NA, "I_group1", "I_group1", "I_group1", 
    "I_group2", "I_group2", "I_group2", "I_group3", "I_group3", 
    "I_group3", NA, NA, NA, NA, NA, NA, NA, NA, NA)), row.names = c(NA, 
-189L), class = c("grouped_df", "tbl_df", "tbl", "data.frame"
), groups = structure(list(id = c("A", "A", "A", "A", "A", "A", 
"A", "B", "B", "B", "B", "B", "B", "B", "C", "C", "C", "C", "C", 
"C", "C", "D", "D", "D", "D", "D", "D", "D", "E", "E", "E", "E", 
"E", "E", "E", "F", "F", "F", "F", "F", "F", "F", "G", "G", "G", 
"G", "G", "G", "G", "H", "H", "H", "H", "H", "H", "H", "I", "I", 
"I", "I", "I", "I", "I"), number = structure(c(1L, 2L, 3L, 4L, 
5L, 6L, 7L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 1L, 2L, 3L, 4L, 5L, 6L, 
7L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 1L, 
2L, 3L, 4L, 5L, 6L, 7L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 1L, 2L, 3L, 
4L, 5L, 6L, 7L, 1L, 2L, 3L, 4L, 5L, 6L, 7L), levels = c("1", 
"2", "3", "4", "5", "6", "7"), class = "factor"), .rows = structure(list(
    1:3, 4:6, 7:9, 10:12, 13:15, 16:18, 19:21, 22:24, 25:27, 
    28:30, 31:33, 34:36, 37:39, 40:42, 43:45, 46:48, 49:51, 52:54, 
    55:57, 58:60, 61:63, 64:66, 67:69, 70:72, 73:75, 76:78, 79:81, 
    82:84, 85:87, 88:90, 91:93, 94:96, 97:99, 100:102, 103:105, 
    106:108, 109:111, 112:114, 115:117, 118:120, 121:123, 124:126, 
    127:129, 130:132, 133:135, 136:138, 139:141, 142:144, 145:147, 
    148:150, 151:153, 154:156, 157:159, 160:162, 163:165, 166:168, 
    169:171, 172:174, 175:177, 178:180, 181:183, 184:186, 187:189), ptype = integer(0), class = c("vctrs_list_of", 
"vctrs_vctr", "list"))), class = c("tbl_df", "tbl", "data.frame"
), row.names = c(NA, -63L), .drop = TRUE))

我使用扩展网格将数据转换为这种格式,用于"类别“和”编号“列,因为我认为这样更容易识别分组。为了解决这个问题,我想到将其透视为宽格式(但是每个id都非常不同,我不确定如何按列分组),和rollapply,但不确定如何指定顺序查找3行而不使用NA。重要的是,不能发生重叠。我感谢r中对此的任何指导/方法。
非常感谢。

u0njafvf

u0njafvf1#

Number输入一个向量并输出1:3重复的向量长度。
不同之处在于如果1 ∶ 3不能均匀配合则在末端使用NA。
然后,在组内,对于NA或非NA的每次运行,使用ave应用Number,然后按顺序对id内的三元组进行编号。最后,我们将grouping名称和NA作为分组条目,这些条目应该是NA。

library(dplyr)
library(data.table) # rleid

Number <- function(x) {
  r <- rep(1:3, length = length(x))
  n <- 3 * (length(r) %/% 3)
  ifelse(seq_along(x) > n, NA, r)
}

result <- df %>%
  group_by(id) %>%
  mutate(grouping = ave(1:n(), rleid(!is.na(value)), FUN = Number) + 0*value,
    grouping = cumsum(coalesce(grouping, 0) == 1) + 0 * grouping) %>%
  ungroup %>%
  mutate(grouping = ifelse(is.na(grouping), NA, paste0(id, "_group", grouping)))

相关问题