2013-04-24 10 views
7

डेटा एक और सवाल मैं चारों ओर के साथ खेल रहा था से आता है: प्राकृतिकdata.table और टेबल अनपेक्षित व्यवहार

dt[user == 3, as.data.frame(table(country))] 
# country Freq 
#1  1 4 
#2  2 1 

dt[user == 4, as.data.frame(table(country))] 
# country Freq 
#1  2 5 

dt[, as.data.frame(table(country)), by = user] 
# user country Freq 
#1: 3  1 4 
#2: 3  2 1 
#3: 4  1 5 
#    ^^^ - why is this 1 instead of 2?! 

धन्यवाद mnel और विक्टर लालकृष्ण:

dt <- data.table(user=c(rep(3, 5), rep(4, 5)), 
       country=c(rep(1,4),rep(2,6)), 
       event=1:10, key="user") 
# user country event 
#1:  3  1  1 
#2:  3  1  2 
#3:  3  1  3 
#4:  3  1  4 
#5:  3  2  5 
#6:  4  2  6 
#7:  4  2  7 
#8:  4  2  8 
#9:  4  2  9 
#10: 4  2 10 

और यहाँ आश्चर्य की बात व्यवहार है अनुवर्ती है - यह 2 नहीं होना चाहिए, यानी यह एक बग है? मैं

dt[, blah, by = user] 

उम्मीद

rbind(dt[user == 3, blah], dt[user == 4, blah]) 

के समान परिणाम वापस जाने के लिए है कि उम्मीद से गलत है?

+2

देश as.data.frame (तालिका (देश)) में एक कारक है? यदि ऐसा है तो ऐसा इसलिए है क्योंकि दोनों स्तरों में स्तर समान नहीं हैं। – mnel

+1

@mnel, जबकि आप सही हैं, तो 'as.data.frame' को 'कारक' के लिए coercing के कारण, अपेक्षित व्यवहार लेबल का प्रतिनिधित्व करने के लिए मूल्य के लिए होगा। मुझे लगता है कि शायद यह वही बात है जो 'rbindlist' के साथ चल रही है: http://stackoverflow.com/questions/15933846/rbindlist-two-data-tables-where-one-has-factor-and-other-has- चरित्र-प्रकार-के लिए/15 9 35715 # 15935715 –

+0

@eddi, मेरे उत्तर में अपडेट देखें। –

उत्तर

5

mnel टिप्पणियों में नोट किया गया, as.data.frame(table(...)) एक डेटा फ्रेम बनाता है जहां पहला चर एक कारक है। user == 4 के लिए, वहाँ कारक है, जो के रूप में 1.

आंतरिक रूप से संग्रहीत किया जाता है में केवल एक ही स्तर क्या आप चाहते हैं कारक स्तरों है, लेकिन (, पूर्णांक के रूप 1 से शुरू) कैसे कारकों आंतरिक रूप से जमा हो जाती है वह पाएं है ।

> dt[, lapply(as.data.frame(table(country)), as.character), by = user] 
    user country Freq 
1: 3  1 4 
2: 3  2 1 
3: 4  2 5 

अद्यतन: निम्नलिखित अपेक्षित परिणाम प्रदान करता है। आपके दूसरे प्रश्न के बारे में: नहीं, मुझे लगता है कि data.table व्यवहार सही है। एक ही बात सादे आर में होता है जब आप विभिन्न स्तरों के साथ दो कारकों में शामिल होने:

> a <- factor(3:5) 
> b <- factor(6:8) 
> a 
[1] 3 4 5 
Levels: 3 4 5 
> b 
[1] 6 7 8 
Levels: 6 7 8 
> c(a,b) 
[1] 1 2 3 1 2 3 
+1

रुचि के नोट के रूप में 'dt [, lapply (as.data.frame.table (देश), as.character), द्वारा = उपयोगकर्ता] 'एक त्रुटि देता है। –

+1

लेकिन शायद यह' data.table' के साथ कुछ भी नहीं है: उदाहरण के लिए 'as.data.frame.table (डीटी $ देश) 'एक ही त्रुटि उत्पन्न करता है –

+0

वह; एक अच्छा बिंदु –

7

मुहावरेदार data.table दृष्टिकोण .N

dt[ , .N, by = list(user, country)] 

यह उपयोग करने के लिए अब तक तेज हो जाएगा और यह भी बनी रहेगी मूल के रूप में एक ही कक्षा के रूप में देश।

+0

अच्छा, धन्यवाद – eddi

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