2012-11-02 17 views
9

मुझे पता है कि यह अन्य पैकेजों के साथ हासिल किया जा सकता है, लेकिन मैं इसे data.table में करने की कोशिश कर रहा हूं (जैसा कि यह समूह के लिए सबसे तेज़ लगता है)।डेटा.table समूह में मौजूदा समूह की लंबाई कैसे प्राप्त करें?

library(data.table) 
dt = data.table(a=c(1,2,2,3)) 
dt[,length(a),by=a] 

परिणाम

a V1 
1: 1 1 
2: 2 1 
3: 3 1 

में जबकि

df = data.frame(a=c(1,2,2,3)) 
ddply(df,.(a),summarise,V1=length(a)) 

a V1 
1 1 1 
2 2 2 
3 3 1 

जो एक और अधिक समझदार परिणाम है पैदा करता है। बस सोच रहा है कि क्यों data.table एक ही परिणाम नहीं दे रहा है, और यह कैसे प्राप्त किया जा सकता है।

उत्तर

16

ऐसा करने के लिए डेटाटेबल तरीका विशेष चर, .N का उपयोग करना है, जो वर्तमान समूह में पंक्तियों की संख्या का ट्रैक रखता है। (अन्य विशेष चर शामिल .SD, .BY (संस्करण 1.8.2) और .I और .GRP (संस्करण 1.8.3 से उपलब्ध है) के सभी ?data.table में दर्ज कर रहे हैं।):

library(data.table) 
dt = data.table(a=c(1,2,2,3)) 

dt[, .N, by = a] 
# a N 
# 1: 1 1 
# 2: 2 2 
# 3: 3 1 

देखने के लिए क्यों क्या तुम didn की कोशिश की ' काम नहीं,, निम्नलिखित चलाने प्रत्येक ब्राउज़र प्रॉम्प्ट पर a और length(a) का मूल्य जाँच:

dt[, browser(), by = a] 
+1

+1 @jamborta भी देखें [पूछे जाने वाले प्रश्न 2.10] (http: //datatable.r-forge.r-project। संगठन/डेटाटेबल-faq.pdf) कुछ पृष्ठभूमि के लिए। संभावित रूप से लंबे वेक्टर (समय और स्थान) के माध्यम से समान समूह मूल्य को दोहराने से बचने के लिए इसका कारण है। लंबे वैक्टर वाले ओप में, आर वांछित 1 वैक्टर रीसायकल करेगा, वैसे भी, जब आवश्यक हो। तो 'एन' यहां जाने का रास्ता है। –

+0

धन्यवाद दोस्तों, यह बहुत उपयोगी है। – jamborta

संबंधित मुद्दे