2016-07-22 121 views
0
生成ID

我有数据仅具有一个列号我要分配ID给每个组的SEQ像分配1 第一个序列1 2 3 4,分配2秒SEQ 1 2 3,分配3第三SEQ 1 2 3 4 5 6有没有人有想法如何使它在R。感谢只有一个SEQ列中的R

df <- data.frame(No = c(1, 2, 3, 4, 1, 2, 3, 1, 2, 3, 4, 5, 6)) 

回答

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 
0

如果序列是有序的,我们就可以得到逻辑索引通过检查1,然后得到累计和。

cumsum(df$No == 1) 
#[1] 1 1 1 1 2 2 2 3 3 3 3 3 3 

或者更快的选择是从data.table

library(data.table) 
setDT(df)[, grp := cumsum(No - shift(No, fill = No[1]) <= 0)] 
shift