मेरे पास एक ऐसा फ़ंक्शन है जो एक सूची में दो मान देता है। दोनों मानों को दो नए कॉलम में डेटाटेबल में जोड़ा जाना चाहिए। समारोह का मूल्यांकन महंगा है, इसलिए मैं फ़ंक्शन को दो बार गणना करने से बचना चाहता हूं। यहां उदाहरण दिया गया है:एक फ़ंक्शन कॉल में R data.table में एकाधिक कॉलम जोड़ें?
library(data.table)
example(data.table)
DT
x y v
1: a 1 42
2: a 3 42
3: a 6 42
4: b 1 4
5: b 3 5
6: b 6 6
7: c 1 7
8: c 3 8
9: c 6 9
यहां मेरे फ़ंक्शन का एक उदाहरण दिया गया है। याद रखें कि मैंने कहा यह महंगा गणना, उसके ऊपर वहाँ अन्य दिए गए मान से एक वापसी मान निकालना (नीचे उदाहरण के रूप में) कोई रास्ता नहीं है है:
myfun <- function (y, v)
{
ret1 = y + v
ret2 = y - v
return(list(r1 = ret1, r2 = ret2))
}
यहाँ एक बयान में दो कॉलम जोड़ने के लिए मेरा तरीका है । उस व्यक्ति को दो बार माईफन कॉल करने की आवश्यकता है, हालांकि:
DT[,new1:=myfun(y,v)$r1][,new2:=myfun(y,v)$r2]
x y v new1 new2
1: a 1 42 43 -41
2: a 3 42 45 -39
3: a 6 42 48 -36
4: b 1 4 5 -3
5: b 3 5 8 -2
6: b 6 6 12 0
7: c 1 7 8 -6
8: c 3 8 11 -5
9: c 6 9 15 -3
यह कैसे करें इस पर कोई सुझाव? जब भी मैं myfun को कॉल करता हूं, तो मैं r2
को एक अलग वातावरण में सहेज सकता हूं, मुझे एक समय में संदर्भ द्वारा दो कॉलम जोड़ने का एक तरीका चाहिए।
आपका फ़ंक्शन डेटा फ्रेम में क्यों नहीं लेता है और सीधे डेटा फ्रेम लौटाता है? 'पीछे <- समारोह (y, v) { ret1 = y + v ret2 = y - वी वापसी (सूची (आर 1 = ret1, r2 = ret2)) } –
@Etienne क्योंकि कि बनाने के लिए प्रतियां आदानों एक नया आउटपुट फ्लोरियन बड़े डेटासेट के साथ अपनी मेमोरी दक्षता के लिए 'data.table' का उपयोग कर रहा है; यह 'x', 'y' या' v' को बिल्कुल भी कॉपी नहीं करता है, यहां तक कि एक बार भी। राम में 20 जीबी डेटासेट सोचें। –