2013-02-15 24 views
5

में this post में सूचियों के कॉलम द्वारा कैसे कुंजी कर सकता हूं, मेरे पास data.table में सूचियों के कॉलम के बारे में एक और सवाल है।मैं डेटा.table

DT = data.table(x=list(c(1,2),c(1,2),c(3,4,5))) 

ऐसा लगता है कि आप सूचियों के कॉलम पर कुंजी नहीं बना सकते हैं।

DT[,y:=.I,by=x] 
Erreur dans `[.data.table`(DT, , `:=`(y, .I), by = x) : 
    The items in the 'by' or 'keyby' list are length (2,2,3). Each must be same length as rows in x or number of rows returned by i (3). 

मैंने सोचा कि मैं एक ही लंबाई की सूची के साथ कर सकता है, लेकिन:

DT = data.table(x=list(c(1,2),c(1,2),c(3,5))) 
DT[,y:=.I,by=x] 
Erreur dans `[.data.table`(DT, , `:=`(y, .I), by = x) : 
    The items in the 'by' or 'keyby' list are length (2,2,2). Each must be same length as rows in x or number of rows returned by i (3). 

वहाँ एक समाधान है? यदि सुविधा अनुरोध के बारे में नहीं है?

+0

हाँ, 'list' (वर्तमान में) एक महत्वपूर्ण स्तंभ के रूप में अनुमति नहीं है। जब आप 'सेटकी (डीटी, "एक्स") – Arun

उत्तर

3

मैं एक समाधान के रूप में इस तरह कुछ करना चाहते हैं:

DT[, y := which(DT$x %in% x), by = 1:nrow(DT)] 

यह पहली मिलान सूचकांक हमेशा की तरह, जो एक समूह आईडी रूप में काम करेंगे देता है।

आप कुछ इस तरह करना चाहिए:

DT[, psnInGrp := seq_along(x), by=y] 

#  x y psnInGrp 
# 1: 1,2 1  1 
# 2: 1,2 1  2 
# 3: 3,4,5 3  1 
+1

दोह ... कॉफी के लिए समय ... – statquant

+0

सामान्य रूप से 'by = 1: nrow (DT)' के बारे में निश्चित नहीं है, तो आपको यह संदेश मिलता है। 'Japply' और दोस्तों को 'j' में उपयोग करने के लिए तेज़ी से हो सकता है। –

+0

@MatthewDowle, क्या '1: nrow (डीटी)' किए बिना पंक्ति-दर-पंक्ति का चयन करना संभव है? – Arun