只有一个seq列在R中生成ID

时间:2016-07-22 14:55:38

标签: r

我的数据只有一列。我想为每组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))

2 个答案:

答案 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)]