我通过以下方式创建数据:
d <- data_frame(ID = rep(sample(500),each = 20))
我想为 5 个连续的唯一 ID 中的每一个创建一个新列。对于此示例,由于每个 ID 的长度是固定的,因此似乎很容易。很简单:
d = d %>% mutate(new_col = rep(sample(100), each = 100))
获得连续 5 个唯一 ID。但是,我生成了不固定的 20 个 ID。我没有添加该部分,因为它需要其他长函数。
我的问题是,在我们有了 ID 之后,我想获取 5 个连续的唯一 ID 中的每一个,并为每个 ID 创建另一列。我相信group_by可能会有所帮助,但我不确定如何使用它。
您可能需要:
d <- d %>% mutate(new_col = cumsum(ID - lag(ID, default = first(ID)) != 0) %/% 5)
基本上,每当 ID 更改时,ID - lag(ID, default = first(ID)) != 0
的计算结果都会TRUE
。对向量进行cumsum
会给出ID
列的 rleid(查看此答案以获取更多信息(,例如0 0 0 1 1 1 2 2 2
。由于您希望每五个 ID 在新列中具有相同的 ID,因此请按5进行模块化除法。
table(d$new_col)
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100
25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100
50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100
75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100
如果 ID 具有不同的长度,这也应该有效。