2013-12-13 5 views
6

गणना करने के लिए यहाँ data.table बल एक data.table है:आर: सभी बातचीत

dat = data.table(var1=rnorm(120), var2=rep(c('a','b','c'),40), var3=rep(c(1,2,3,2,1,2,1,2,2,3,1,2),10)) 

dat2 = dat[,list(resp = mean(var1)),by=list(var2, var3)] 

dat2 में, dat$var2 एट का केवल मौजूदा बातचीत dat$var3 मौजूद हैं। var2 और var3 के लिए सभी 9 संभावित इंटरैक्शन (dat2 की 7 पंक्तियों के बजाय) के परिणामको कैसे लागू कर सकते हैं? यदि डेटाटेबल के साथ कोई सीधा समाधान नहीं है, तो इस मुद्दे को हल करने का सबसे आसान तरीका क्या है?

table(dat$var2, dat$var3) 

    1 2 3 
    a 20 10 10 
    b 20 20 0 
    c 0 30 10 

बेशक, बातचीत, जहां कोई डेटा dat में मौजूद के लिए, dat2 एनए resp में शामिल करना चाहिए।

+0

'.d.data.table (data.frame (...)) के बजाय 'data.table (...)' क्यों न करें? – Arun

+0

कोई कारण नहीं, वह गूंगा था! मैंने ठीक कर दिया! धन्यवाद –

उत्तर

6

आप key सेट कर सकते हैं और फिर एक CROSSJOIN i इसलिए की तरह में CJ का उपयोग कर ...

setkey(dat , var2 , var3) 

# Thanks to @Shadow for pointing out to use unique() in the cross join 
dat[ CJ(unique(var2) , unique(var3)) , mean(var1) ] 
# var2 var3   V1 
#1: a 1 -0.25771923 
#2: a 2 0.04143057 
#3: a 3 0.28878451 
#4: b 1 0.18865887 
#5: b 2 0.53632552 
#6: b 3   NA 
#7: c 1   NA 
#8: c 2 0.38015021 
#9: c 3 0.49809159 

और स्पष्टीकरण के माध्यम से, CJ()x की i में एक data.table बनाता है (इस मामले में dat) पर शामिल होने के लिए। यह CJ() को प्रदान किए गए वैक्टरों के क्रॉस उत्पाद के रूप में गठित किया गया है, जो ठीक वही होता है जो आप खोज रहे हैं!

+1

मैं मानता हूं कि 'सीजे' संस्करण नीचे दिए गए 'expand.grid' की तुलना में अधिक समझ में आता है। लेकिन सामान्यता के लिए मुझे अभी भी लगता है कि 'डेटा [सीजे (अद्वितीय (var2), अद्वितीय (var3)), माध्य (var1)] 'अक्षरों [1: 3]' और '1: 3' का स्पष्ट रूप से उपयोग करने से अधिक उचित होगा । – shadow

+0

@ छाया हाँ यकीन है कि आप पूरी तरह से सही हैं, अच्छी कॉल। –

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