2012-05-24 15 views
8

मैं समूह द्वारा डेटाटेबल में संदर्भ द्वारा अभी तक लागू नहीं किए गए (मेरे ज्ञान के लिए) असाइनमेंट का सबसे अच्छा विकल्प ढूंढ रहा हूं। data.table उदाहरण का उपयोग करना,डेटाटेबल समूहबद्ध असाइनमेंट के लिए डीटी [, x: = f (y), = z] के रूप में कुशल विकल्प?

DT = data.table(x=rep(c("a","b","c"),each=3), y=c(1,3,6), v=1:9) 
    x y v 
[1,] a 1 1 
[2,] a 3 2 
[3,] a 6 3 
[4,] b 1 4 
[5,] b 3 5 
[6,] b 6 6 
[7,] c 1 7 
[8,] c 3 8 
[9,] c 6 9 

मैं एक नया स्तंभ जेड को जोड़ने के लिए, च युक्त चाहते हैं (y, v) एक्स के मूल्यों के आधार पर वर्गीकृत (देता है च (y, v) = मतलब (y) ले + v)। ध्यान दें कि मैं प्रिंट या के रूप में

DT[,mean(y)+v,by=x] 
     x  V1 
[1,] a 4.333333 
[2,] a 5.333333 
[3,] a 6.333333 
[4,] b 7.333333 
[5,] b 8.333333 
[6,] b 9.333333 
[7,] c 10.333333 
[8,] c 11.333333 
[9,] c 12.333333 

में बल्कि मैं डीटी के लिए परिणाम जोड़ना चाहते हैं इस गणना के परिणाम स्टोर करने के लिए नहीं करना चाहती:

 x y v  V1 
[1,] a 1 1 4.333333 
[2,] a 3 2 5.333333 
[3,] a 6 3 6.333333 
[4,] b 1 4 7.333333 
[5,] b 3 5 8.333333 
[6,] b 6 6 9.333333 
[7,] c 1 7 10.333333 
[8,] c 3 8 11.333333 
[9,] c 6 9 12.333333 

मेरी data.table 262 एमबी है, ऐसी है कि

DT <- DT[,transform(.SD,mean(y)+v),by=x] 

, एक विकल्प नहीं है के बाद से मैं स्मृति में दो बार डीटी फिट नहीं कर सकते हैं (जो प्रति आपरेशन द्वारा निहित है, मुझे लगता है)। तथ्य यह है कि मैंने कभी ऑपरेशन खत्म नहीं देखा है।

मेरे पास कौन से विकल्प हैं (जब तक डेटाटेबल डीटी के साथ आता है [, z: = mean (y) + v, by = x])?

मैंने अभी डीटी [newDT] के बारे में पढ़ा है। यहाँ क्या गलत है?

newDT <- DT[,mean(y)+v,by=x] 
     x  V1 
[1,] a 4.333333 
[2,] a 5.333333 
[3,] a 6.333333 
[4,] b 7.333333 
[5,] b 8.333333 
[6,] b 9.333333 
[7,] c 10.333333 
[8,] c 11.333333 
[9,] c 12.333333 

(जो संभव स्मृति बुद्धिमान है।) तो:

> DT[newDT] 
setkey(DT,x) 
setkey(newDT,x) 
x y v  V1 
a 1 1 4.333333 
a 3 2 4.333333 
a 6 3 4.333333 
a 1 1 5.333333 
a 3 2 5.333333 
a 6 3 5.333333 
a 1 1 6.333333 
a 3 2 6.333333 
a 6 3 6.333333 
b 1 4 7.333333 
b 3 5 7.333333 
b 6 6 7.333333 
b 1 4 8.333333 
b 3 5 8.333333 
b 6 6 8.333333 
b 1 4 9.333333 
b 3 5 9.333333 
b 6 6 9.333333 
c 1 7 10.333333 
c 3 8 10.333333 
c 6 9 10.333333 
c 1 7 11.333333 
c 3 8 11.333333 
c 6 9 11.333333 
c 1 7 12.333333 
c 3 8 12.333333 
c 6 9 12.333333 

लेकिन यह नहीं है कि मैं क्या चाहता हूँ। यहाँ क्या गलती है?

+0

+1 महान प्रश्न:

तो यह अपना रास्ता जो मेरी आप एक दूसरी चाबी की जरूरत काफी समान है ऐसा करने के लिए! –

उत्तर

4
DT[, xm := ave(y, x, FUN=mean) + v] 
+0

+1 बहुत अच्छा समाधान है, मैंने केवल अपना लंबा लिखा है क्योंकि मैंने सोचा था कि आपका काम नहीं करता है। 'एवी' पर दूसरा नजर रखने के बाद, मुझे लगता है कि आप बस 'डीटी [, xm: = ave (y, x, FUN = mean) + v] '। फिर यह एक आकर्षण की तरह काम करता है और सबसे कुशल हो सकता है। –

+1

+1 चूंकि ',' 'से 'तेज है, हालांकि, यह अधिक कुशल (हालांकि बदसूरत) होना चाहिए जब तक" समूह: = समूह द्वारा "समाप्त नहीं होता है:' डीटी [, xm: = डीटी [, माध्य (वाई) + वी, द्वारा = एक्स] [[2]]] ' –

+0

धन्यवाद एक टन लोग। मुझे पता नहीं था कि 'अस्तित्व' अस्तित्व में है। समूह द्वारा ': =' की प्रतीक्षा कर रहे हैं! –

3

मैं निम्नलिखित करना होगा:

DT[, list(fvy = mean(y)), by="x"][DT][, fvy := fvy + v] 

तो मूल रूप से, मैं इसे अलग दो भागों में: सबसे पहले, मैं y की औसत की गणना और डीटी है कि जोड़ने के लिए, तो मैं v में जोड़ें y का मतलब। मेमोरी-वार मुझे यकीन नहीं है कि यह वास्तव में मदद करता है, लेकिन लेखक के पास एक अच्छा मौका है और हमें बताएं ;-)

आपके प्रश्न के बारे में यह क्यों काम नहीं कर रहा है: असल में, आप समाप्त होते हैं दो डेटाटेबल्स जिन्हें आप मर्ज करना चाहते हैं: DT और newDT। दोनों डेटाटेबल्स में प्रत्येक कुंजी तीन बार होती है। तो जाहिर है, जब आप उन्हें मर्ज करते हैं, तो प्रत्येक संयोजन परिणाम में होता है और यही कारण है कि आप 9 ए, बी, और सी के साथ डेटाटेबल प्राप्त करते हैं।

newDT <- DT[,list(fvy=mean(y)+v, v),by=x] 
setkey(newDT, x, v) 
setkey(DT, x, v) 
DT[newDT] 
     x v y  fvy 
[1,] a 1 1 4.333333 
[2,] a 2 3 5.333333 
[3,] a 3 6 6.333333 
[4,] b 4 1 7.333333 
[5,] b 5 3 8.333333 
[6,] b 6 6 9.333333 
[7,] c 7 1 10.333333 
[8,] c 8 3 11.333333 
[9,] c 9 6 12.333333 
+1

+1। हमें वास्तव में समूह द्वारा ': =' की आवश्यकता है, हम नहीं। लगभग वहाँ। बीटीडब्ल्यू, कंपाउंड ': =' कभी-कभी काम में आता है: 'डीटी [, न्यूएक्स: = कोला + 2] [, नया: = न्यूएक्स * 2] [, न्यूज़: = कोला + न्यूएक्स + न्यूटी] ... ' –

+2

लेकिन मैं अभी तक '' '' '' '' '' '' '' '' '' 'तक नहीं होगा, बस अगर कोई इसकी उम्मीद कर रहा है। अगले संस्करण के लिए यह '' = '' '' 'होगा। भविष्य के संस्करण 'डीटी [, {newx: = colb + 2; newy: = newx + colc}, = cola द्वारा]' –

+0

धन्यवाद christoph_J हो सकता है। वह महत्वपूर्ण बात कुल समझ में आता है। –

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