2013-07-02 5 views
5

मैं डेटा.table में सभी कॉलम में एक फ़ंक्शन लागू करना चाहता हूं। इसलिए, मैं लापरवाही से एसडी का उपयोग करता हूं। लेकिन, लापरवाही के अंदर मैं अपनी मेज के कॉलम को पुनः प्राप्त नहीं कर सकता।लापरवाही के अंदर कॉलम नाम पुनर्प्राप्त करें। एसडी

उदाहरण

x = data.table(a=1:10, b=10:1, id=1:5) 
x[,lapply(.SD,function(t){t*id}),.SDcols=c(1,2)] 
Error in ..FUN(a) : object 'id' not found 

के लिए मैं निम्न कार्य करें:

x[,lapply(.SD,function(t){t*x$id}),.SDcols=c(1,2)] 

हम बेहतर कर सकते हैं?

उत्तर

4

बस .SDcols=c(1,2) हटा दें। कि तीसरे स्तंभ (id)

> x[,lapply(.SD,function(t){t*id})] 
    a b id 
1: 1 10 1 
2: 4 18 4 
3: 9 24 9 
4: 16 28 16 
5: 25 30 25 
6: 6 5 1 
7: 14 8 4 
8: 24 9 9 
9: 36 8 16 
10: 50 5 25 

id नहीं करने के लिए निकाल देता है, सभी निम्नलिखित काम करेगा:

x[,lapply(.SD[,list(a,b)], `*`, id)] 

x[,lapply(.SD[,-3, with=F], `*`, id)] 

x[,lapply(.SD, `*`,id)][, list(a,b)] 
+1

धन्यवाद! क्या कॉलम पर फ़ंक्शन को लागू करने से बचने का कोई तरीका है? – Nicolas

+1

@ निकोलस कृपया मेरे संपादन की जांच करें। छोटी टिप, यदि आप गति को ध्यान में रखते हैं, तो अपने फ़ंक्शन को सबसे कॉम्पैक्ट संरचना देने के लिए हमेशा प्रयास करें (अक्सर इसका अर्थ है तेज़ कोड)। – Michele

+0

मुझे आपके द्वारा दिए गए तीन विकल्पों में से पहला पसंद है, हालांकि 'एसडी' का उपयोग अनावश्यक हो जाता है। मुझे लगता है कि 'एक्स [, लापरवाही (सूची (ए, बी), '*', आईडी)]' सबसे अच्छा समाधान है, और इसमें पहले स्थान पर '.SDcols' का उपयोग करने से अधिक टाइपिंग शामिल नहीं है। –

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