我的数据只有一列。我想为每组seq分配id
第一个seq 1 2 3 4
已分配1,第二个seq 1 2 3
已分配2,第三个seq 1 2 3 4 5 6
已分配3.是否有人知道如何在R中进行此操作。谢谢
df <- data.frame(No = c(1, 2, 3, 4, 1, 2, 3, 1, 2, 3, 4, 5, 6))
答案 0 :(得分:2)
使用diff
函数检查降序发生的断点,结果上的cumsum
将为每个升序创建一个id,因为第一个元素将始终位于第一个序列中并且为了补偿从diff
函数减少的长度,您需要在序列前加0或1,具体取决于您是否希望组从0或1开始:
cumsum(c(0, diff(df$No) < 0))
# [1] 0 0 0 0 1 1 1 2 2 2 2 2 2
cumsum(c(1, diff(df$No) < 0))
# [1] 1 1 1 1 2 2 2 3 3 3 3 3 3
答案 1 :(得分:0)
如果序列是有序的,我们可以通过检查1得到逻辑索引,然后得到累积和。
cumsum(df$No == 1)
#[1] 1 1 1 1 2 2 2 3 3 3 3 3 3
或者来自shift
data.table
library(data.table)
setDT(df)[, grp := cumsum(No - shift(No, fill = No[1]) <= 0)]