2012-10-22 12 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 

मैं एक पूर्णांक वेक्टर प्रत्येक पंक्ति इसी "कुंजी सूचकांक" के लिए दे रही है प्राप्त करना चाहते हैं । मुझे आशा है कि उम्मीद निर्गम (स्तंभ i) नीचे में मदद मिलेगी स्पष्ट है कि मैं क्या मतलब है:

#  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])) की तरह कुछ का उपयोग कर के बारे में सोचा लेकिन आशा करता हूं वहाँ एक बेहतर समाधान है। मुझे लगता है कि यह वेक्टर तालिका के आंतरिक प्रतिनिधित्व का हिस्सा हो सकता है, और शायद इसका उपयोग करने का कोई तरीका है? यहां तक ​​कि अगर यह मामला नहीं है, तो आप क्या सुझाव देंगे?

उत्तर

45

अद्यतन: v1.8.3 से, आप बस इनबिल्ट विशेष उपयोग कर सकते हैं .GRP:

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

पुराने उत्तरों के लिए इतिहास देखें।

+4

मुझे लगता है कि 'जीआरपी' एक बहुत अच्छा विचार है, और अतीत में इसके लिए कामना की है। अच्छा और प्रतीत होता है इष्टतम समाधान, बीटीडब्ल्यू। –

+2

@ जोशो'ब्रायन ओके, 'जीआरपी' अब 1.8.3 में। –

+1

कोई इन और अन्य चर जैसे 'एसडीसीओल्स' पर प्रलेखन कैसे ढूंढता है? ?? जीआरपी आदि –

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)))]] 
संबंधित मुद्दे