为连续分组提供唯一标识符

时间:2016-07-19 17:07:38

标签: r

我试图根据序号识别群组。例如,我有一个看起来像这样的数据框(简化):

UID
1
2
3
4
5
6
7
11
12
13
15
17
20
21
22

我想添加一个列,用于标识何时存在连续数字的分组,例如,1到7是第一个连续的,然后它们得到1,第二个连续的集合将得到2等。

UID Group
1   1
2   1
3   1
4   1
5   1
6   1
7   1
11  2
12  2
13  2
15  3
17  4
20  5
21  5
22  5

现有的代码都没有帮助我解决这个问题

2 个答案:

答案 0 :(得分:1)

以下是一个使用diff的基本R方法,逻辑检查和cumsum

cumsum(c(1, diff(df$UID) > 1))
 [1] 1 1 1 1 1 1 1 2 2 2 3 4 5 5 5

将其添加到data.frame,我们得到:

df$id <- cumsum(c(1, diff(df$UID) > 1))
df
   UID id
1    1  1
2    2  1
3    3  1
4    4  1
5    5  1
6    6  1
7    7  1
8   11  2
9   12  2
10  13  2
11  15  3
12  17  4
13  20  5
14  21  5
15  22  5

或者您也可以按如下方式使用dplyr:

library(dplyr)
df %>% mutate(ID=cumsum(c(1, diff(df$UID) > 1)))
#   UID ID
#1    1  1
#2    2  1
#3    3  1
#4    4  1
#5    5  1
#6    6  1
#7    7  1
#8   11  2
#9   12  2
#10  13  2
#11  15  3
#12  17  4
#13  20  5
#14  21  5
#15  22  5

答案 1 :(得分:0)

我们还可以使用data.table中的library(data.table) setDT(df1)[, Group := cumsum(UID- shift(UID, fill = UID[1])>1)+1] df1 # UID Group # 1: 1 1 # 2: 2 1 # 3: 3 1 # 4: 4 1 # 5: 5 1 # 6: 6 1 # 7: 7 1 # 8: 11 2 # 9: 12 2 #10: 13 2 #11: 15 3 #12: 17 4 #13: 20 5 #14: 21 5 #15: 22 5 函数获取当前行和上一行之间的差异,获取逻辑向量的累积总和并指定它以创建“组”列。这会更快。

<Connector port="4432" protocol="HTTP/1.1" SSLEnabled="true"
               maxThreads="150" scheme="https" secure="true"
               clientAuth="false" sslProtocol="TLS" 
               keystoreFile="some_path"
               keystorePass="some_pass" />