2017-11-07 9 views
1

시스템 내의 항목 이동을 추적하는 data.table이 있습니다. 이 데이터를 IDLocation의 두 필드를 기준으로 그룹화하고 싶습니다. I는 출력으로서 싶은 어떤연속적인 필드 값에 기초한 인덱싱

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 

관계없이 새로운 위치가 무엇인지, 각 타임 위치 변화를 증가 번호와 새로운 열 (즉 그 위치가 기록 다른 곳에 존재하는 경우). 그룹 내에서 만 증가하는 this question의 반대가 아닙니다.

expected_output <- 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), 
        Group = c(1,2,3,4,5,6,1,1,1,2,2,3,1,2,2,2,3,4)) 
expected_output 
#  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 

는 지금까지 약간의 행운 by 인수의 몇 가지 조합을 시도했습니다. 가장 가까운 부분은 diff인데, 변경이 발생하면 부분적으로 올바르게 표시되지만 내부적으로는 증가합니다.

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 

이 시점에서 나는 솔루션이 나를 빤히 쳐다보고 있다고 확신하지만 꽤 분실했다.

답변

3

그런 다음 ID 및 그룹화가 rleidLocation 열으로 수행 할 수 있습니다 보인다

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 
+2

가 완벽하게 작동하는, 감사합니다! 나는 이전에'rleid '에 대해 알지 못했다. 그렇게하면 곧 받아 들일거야. – Gaffi