2012-10-22 3 views
28

data.table의 키를 생성 한 후 "그룹 카운터는"data.table "키 인덱스"또는

set.seed(12345) 
DT <- data.table(x = sample(LETTERS[1:3], 10, replace = TRUE), 
       y = sample(LETTERS[1:3], 10, replace = TRUE)) 
setkey(DT, x, y) 
DT 
#  x y 
# [1,] A B 
# [2,] A B 
# [3,] B B 
# [4,] B B 
# [5,] C A 
# [6,] C A 
# [7,] C A 
# [8,] C A 
# [9,] C C 
# [10,] C C 

나는 정수 벡터는 각 행에 대응하는 "키 인덱스"를주고 좀하고 싶습니다 .

#  x y i 
# [1,] A B 1 
# [2,] A B 1 
# [3,] B B 2 
# [4,] B B 2 
# [5,] C A 3 
# [6,] C A 3 
# [7,] C A 3 
# [8,] C A 3 
# [9,] C C 4 
# [10,] C C 4 

내가 cumsum(!duplicated(DT[, key(DT), with = FALSE])) 같은 것을 사용에 대한 생각하지만, 더 나은 솔루션이 바라고 : 나는 예상되는 출력 (열 i가) 아래 무슨 뜻인지 명확히 도움이되기를 바랍니다. 이 벡터가 테이블의 내부 표현의 일부가 될 수 있다고 생각합니다. 아마도이 벡터에 액세스 할 수있는 방법이 있을까요? 그것이 사실이 아니더라도, 당신은 무엇을 건의 할 것입니까?

답변

45

업데이트 : v1.8.3에서, 당신은 단순히 붙박이 특수를 사용할 수 있습니다 .GRP :

,536,
DT[ , i := .GRP, by = key(DT)] 

이전 답변에 대한 기록을보십시오.

+4

나는 .GRP가 아주 좋은 생각이고, 과거에는 그것을 바랬다 고 생각한다. 멋지고 겉으로보기에는 최적의 해결책입니다. –

+2

@ JoshO'Brien Ok, .GRP가 1.8.3에 추가되었습니다. –

+1

'.SDcols'와 같은 다른 변수에 대한 문서는 어떻게 찾을 수 있습니까? ?? .GRP' 등 –

12

내가 [.data.table()에 인덱스 카운터가 호출 내에서 사용할 수없는 것으로 상당히 확신 때문에 나는 아마,이 작업을 수행 할 것 :

ii <- unique(DT) 
ii[ , i := seq_len(nrow(ii))] 
DT[ii] 
#  x y i 
# 1: A B 1 
# 2: A B 1 
# 3: B B 2 
# 4: B B 2 
# 5: C A 3 
# 6: C A 3 
# 7: C A 3 
# 8: C A 3 
# 9: C C 4 
# 10: C C 4 

당신이 한 라이너 만들 수있는 비용으로, unique.data.table()에 추가 호출의 :

DT[unique(DT)[ , i := seq_len(nrow(unique(DT)))]]