2014-08-29 14 views
9

में सशर्त बयान का उपयोग करना मैं कुछ शर्तों के आधार पर एक चर को रिकोड करने के लिए डेटा.table का उपयोग करने का प्रयास कर रहा हूं। मेरे मूल डेटासेट में लगभग 30 एम रिकॉर्ड हैं और सभी परिवर्तनीय सृजन के बाद लगभग 130 चर हैं। मैं तरीकों यहाँ सुझाव का प्रयोग किया: conditional statements in data.table(एम 1) और भी यहाँ data.table: Proper way to do create a conditional variable when column names are not known?(M2)r data.table

मेरा लक्ष्य नीचे दिए गए कोड के बराबर है, लेकिन कुछ है कि का उपयोग कर लागू होता है मिलता है data.table

samp$lf5 <- samp$loadfactor5 

samp$lf5 <- with(samp, ifelse(loadfactor5 < 0, 0, lf5)) 

मैं स्वीकार करूंगा कि मुझे समझ में नहीं आ रहा है। एसडी और एसडीकॉल बहुत अच्छी तरह से, इसलिए मैं इसे गलत इस्तेमाल कर रहा हूं। कोड और से त्रुटियों (एम 1) और (M2) नीचे दिए गए हैं और नमूना डेटासेट यहाँ है: http://goo.gl/Jp97Wn

(एम 1)

samp[,lf5 = if(loadfactor5 <0) 0 else loadfactor5] 

त्रुटि संदेश

Error in `[.data.table`(samp, , lf5 = if (loadfactor5 < 0) 0 else loadfactor5) : 
unused argument (lf5 = if (loadfactor5 < 0) 0 else loadfactor5) 

जब मैं ऐसा करता हूं:

samp[,list(lf5 = if(loadfactor5 <0) 0 else loadfactor5)] 

यह एक सूची के रूप LF5 देता है, लेकिन नहीं samp के हिस्से के रूप में data.table और वास्तव में हालत लागू नहीं होता है के रूप में LF5 अभी भी 0.

(M2) की तुलना में कम मूल्य हैं

Col1 <- "loadfactor5" 
Col2 <- "lf5" 

setkeyv(samp,Col1) 
samp[,(Col2) :=.SD,.SDCols = Col1][Col1<0,(Col2) := .SD, .SDcols = 0] 

मैं निम्न त्रुटि

Error in `[.data.table`(samp, , `:=`((Col2), .SD), .SDCols = Col1) : 
unused argument (.SDCols = Col1) 

कैसे इस सराहना खत्म करने के लिए पर कोई अंतर्दृष्टि मिलता है। मेरे डेटासेट में 30 एम रिकॉर्ड हैं इसलिए मैं रनटाइम को वास्तव में कट करने के लिए डेटाटेबल का उपयोग करने की उम्मीद कर रहा हूं।

धन्यवाद,

कृष्णन

+2

'सैंप [, एलएफ 5: = ifelse (loadfactor5 <0, 0, loadfactor5)]'; – eddi

+0

पर यह पता लगाने के लिए एसओ पर 'एसडी' की खोज करें कि मैं वांछित परिणाम प्राप्त करने के लिए इस आदेश का उपयोग करने में सक्षम था। – Krishnan

+0

@ कृष्णन, क्या आप इसे स्वयं उत्तर दे सकते हैं और इसे स्वीकार कर सकते हैं ताकि क्यू का उत्तर दिया जा सके? धन्यवाद। – Arun

उत्तर

17

उत्तर पूर्णता के लिए के लिए eddi द्वारा प्रदान की और यहां भी शामिल थे।

samp[, lf5 := ifelse(loadfactor5 < 0, 0, loadfactor5)]

+1

मुझे लगता है कि प्रश्न का प्रश्न "=" के बजाय ": =" का उपयोग करना है।और आप सैंप भी लिख सकते हैं [, lf5: = loadfactor5 * (loadfactor> = 0)] – skan

2

एक और तरीका है (जो मैं पसंद है क्योंकि यह, मेरी राय में, क्लीनर):

samp[, lf5 := 0]; samp[loadfactor5 > 0, lf5 := loadfactor5]; 

मैं 90 मिलियन से अधिक पंक्तियों के साथ एक डाटासेट साथ data.table का उपयोग करें; मैं लगातार आश्चर्यचकित हूं कि ऊपर की तरह संचालन के लिए डेटाटेबल कितनी तेजी से है।

+0

मेरे पास 12 एम पंक्तियों के साथ एक डाटाटेबल है और मुझे फ़ील्ड को संशोधित करने की आवश्यकता है और जब मैं डीटी करता हूं [, प्रकार: = ifelse (is.na (प्रकार) == सही, "नहीं", प्रकार)] इसमें 7 सेकंड लगते हैं जो कितनी देर तक लेता है। क्या इसे किसी तरह से बढ़ाया जा सकता है? – user3022875