R 基于连续字段值的索引

R 基于连续字段值的索引,r,data.table,grouping,R,Data.table,Grouping,我在R中有一个数据表,跟踪系统内项目的移动。我想根据两个字段对这些数据进行分组,ID和Location library(data.table) example <- data.table(ID = rep(LETTERS[1:3], each = 6), Location = c(1,2,3,1,2,1,2,2,2,3,3,1,2,3,3,3,1,3)) example # ID Location # 1: A 1 #

我在R中有一个
数据表
,跟踪系统内项目的移动。我想根据两个字段对这些数据进行分组,
ID
Location

library(data.table)
example <- data.table(ID = rep(LETTERS[1:3], each = 6),
                      Location = c(1,2,3,1,2,1,2,2,2,3,3,1,2,3,3,3,1,3))
example
#     ID Location
#  1:  A        1
#  2:  A        2
#  3:  A        3
#  4:  A        1
#  5:  A        2
#  6:  A        1
#  7:  B        2
#  8:  B        2
#  9:  B        2
# 10:  B        3
# 11:  B        3
# 12:  B        1
# 13:  C        2
# 14:  C        3
# 15:  C        3
# 16:  C        3
# 17:  C        1
# 18:  C        3

在这一点上,我很迷茫,尽管我确信解决方案就在眼前。

您可以按
ID
分组,然后选择
Location
列的
rleid

example[, Group := rleid(Location), ID]
example
#    ID Location Group
# 1:  A        1     1
# 2:  A        2     2
# 3:  A        3     3
# 4:  A        1     4
# 5:  A        2     5
# 6:  A        1     6
# 7:  B        2     1
# 8:  B        2     1
# 9:  B        2     1
#10:  B        3     2
#11:  B        3     2
#12:  B        1     3
#13:  C        2     1
#14:  C        3     2
#15:  C        3     2
#16:  C        3     2
#17:  C        1     3
#18:  C        3     4

all.equal(example, expected_output)
# [1] TRUE

这似乎很有效,谢谢!我以前不知道
rleid
。只要允许,我会尽快接受。
output <- example
output[, Group := 1:.N, by = paste0(ID, Location, diff(Location))]
output
#     ID Location Group
#  1:  A        1     1 
#  2:  A        2     1 # not incrementing/new group
#  3:  A        3     1 # not incrementing/new group
#  4:  A        1     2
#  5:  A        2     1
#  6:  A        1     3
#  7:  B        2     1
#  8:  B        2     2 # incrementing when shouldn't
#  9:  B        2     1 
# 10:  B        3     1 
# 11:  B        3     1
# 12:  B        1     1
# 13:  C        2     1
# 14:  C        3     1
# 15:  C        3     2
# 16:  C        3     1
# 17:  C        1     1
# 18:  C        3     1
example[, Group := rleid(Location), ID]
example
#    ID Location Group
# 1:  A        1     1
# 2:  A        2     2
# 3:  A        3     3
# 4:  A        1     4
# 5:  A        2     5
# 6:  A        1     6
# 7:  B        2     1
# 8:  B        2     1
# 9:  B        2     1
#10:  B        3     2
#11:  B        3     2
#12:  B        1     3
#13:  C        2     1
#14:  C        3     2
#15:  C        3     2
#16:  C        3     2
#17:  C        1     3
#18:  C        3     4

all.equal(example, expected_output)
# [1] TRUE