2015-10-05 9 views
14

में मैं डेटाटेबल कोल्स का एक सबसेट एक नई कक्षा में कनवर्ट करना चाहता हूं। यहाँ एक लोकप्रिय सवाल है (Convert column classes in data.table) लेकिन उत्तर स्टार्टर ऑब्जेक्ट पर काम करने के बजाए एक नई वस्तु बनाता है।कनवर्ट करें * कुछ * कॉलम क्लासेस डेटा.table

dat <- data.frame(ID=c(rep("A", 5), rep("B",5)), Quarter=c(1:5, 1:5), value=rnorm(10)) 
cols <- c('ID', 'Quarter') 

कैसे सबसे अच्छा (जैसे) एक कारक के लिए सिर्फ cols कॉलम में बदलने के लिए:

इस उदाहरण लें? एक सामान्य data.frame में आप ऐसा कर सकता है:

dat[, cols] <- lapply(dat[, cols], factor) 

लेकिन यह एक data.table लिए काम नहीं करता है, और न तो इस

dat[, .SD := lapply(.SD, factor), .SDcols = cols] 

मैट Dowle से जुड़ा हुआ प्रश्न में एक टिप्पणी करता है (दिसंबर 2013 से) निम्नलिखित का सुझाव देता है, जो ठीक काम करता है, लेकिन थोड़ा कम सुरुचिपूर्ण लगता है।

for (j in cols) set(dat, j = j, value = factor(dat[[j]])) 

वर्तमान में एक बेहतर data.table जवाब है (अर्थात कम + एक काउंटर चर उत्पन्न नहीं करता है), या मैं बस के ऊपर स्थित + rm(j) इस्तेमाल करना चाहिए?

+0

मेरा मानना ​​है कि विधि मैट Dowle सिफारिश की गई है सबसे अच्छा होगा। वह, सब के बाद, * data.table * लेखक है। –

+1

यह सच है, लेकिन टिप्पणी 2013 से था और उसके बाद से कई पैकेज अपडेट कर दिया गया है, तो मैं यह सोचा 'के लिए (...) सेट (...) पर बाहर – arvi1000

+2

अधिक विस्तार इस मछली पकड़ने की लाइन फेंकने लायक' मुहावरा जोड़ा हाल ही में यहां: http://stackoverflow.com/a/33000778/403310 –

उत्तर

26

, इस प्रकार स्तंभ वर्गों को बदलने का एक और तरीका है ऑपरेटर आप संदर्भ द्वारा डेटाटेबल अद्यतन करते हैं। एक चेक कि क्या यह काम किया:

for (col in cols) set(dat, j = col, value = factor(dat[[col]])) 

जो ही परिणाम प्राप्त होगा:

> sapply(dat,class) 
     ID Quarter  value 
"factor" "factor" "numeric" 

टिप्पणी में @MattDowle द्वारा suggeted रूप में, आप भी for(...) set(...) का एक संयोजन के रूप में इस का उपयोग कर सकते हैं। एक तीसरा विकल्प नहीं है:

for (col in cols) dat[, (col) := factor(dat[[col]])] 

एक छोटे डेटासेट पर, for(...) set(...) विकल्प के बारे में तीन बार lapply विकल्प की तुलना में तेजी है (लेकिन वह वास्तव में बात है क्योंकि यह एक छोटे से डाटासेट है नहीं है,)। बड़े डेटासेट्स (जैसे 2 मिलियन पंक्तियां) पर, इनमें से प्रत्येक दृष्टिकोण में लगभग उसी समय लगते हैं। एक बड़ा डाटासेट पर परीक्षण के लिए, मैं प्रयोग किया है:

dat <- data.table(ID=c(rep("A", 1e6), rep("B",1e6)), 
        Quarter=c(1:1e6, 1:1e6), 
        value=rnorm(10)) 

कभी कभी, आप इसे थोड़ा अलग करने के लिए (उदाहरण के लिए जब संख्यात्मक मान एक कारक के रूप में जमा हो जाती) होगा।तो फिर तुम कुछ इस तरह उपयोग करने के लिए:

dat[, (cols) := lapply(.SD, function(x) as.integer(as.character(x))), .SDcols=cols] 


चेतावनी:निम्नलिखित विवरण नहीं काम करने के data.table -तरह है। डेटाटेबल संदर्भ द्वारा अपडेट नहीं किया गया है क्योंकि एक प्रतिलिपि बनाई जाती है और स्मृति में संग्रहीत होती है (जैसा कि @ फ्रैंक द्वारा इंगित किया गया है), जो स्मृति उपयोग को बढ़ाता है। यह with=FALSE के कामकाज की व्याख्या करने के लिए एक और अतिरिक्त है।

आप स्तंभ कक्षाएं एक ही तरह से बदलने के लिए के रूप में आप एक dataframe साथ करना होगा चाहते हैं, तो आप इस प्रकार with = FALSE जोड़ने के लिए:

dat[, cols] <- lapply(dat[, cols, with = FALSE], factor) 

एक चेक कि क्या यह काम किया:

> sapply(dat,class) 
     ID Quarter  value 
"factor" "factor" "numeric" 

आप with = FALSE शामिल नहीं करते हैं, datatable dat[, cols] वेक्टर के रूप में मूल्यांकन करेंगे। dat[, cols] और dat[, cols, with=FALSE] के बीच उत्पादन में अंतर की जाँच करें:

> dat[, cols] 
[1] "ID"  "Quarter" 

> dat[, cols, with=FALSE] 
    ID Quarter 
1: A  1 
2: A  2 
3: A  3 
4: A  4 
5: A  5 
6: B  1 
7: B  2 
8: B  3 
9: B  4 
10: B  5 
+1

मुझे लगता है कि आप '<-' का उपयोग नहीं करना चाहते हैं। यदि मैं पहले और उसके बाद 'पता()' चलाता हूं, तो ऐसा लगता है कि संशोधन संदर्भ के अनुसार नहीं है (भले ही '[<-। Data.table' इस उपयोग को कवर करता है)। – Frank

+1

@Frank मुझे पता है, लेकिन मैं मुख्य रूप से दूसरे भाग जोड़ा समझाने के लिए क्यों तुम = FALSE' साथ की जरूरत है 'जब आप एक datatable एक dataframe के रूप में कॉलम उसी तरह वापस जाने के लिए चाहते हैं। मैंने एक चेतावनी जोड़ा। – Jaap

+0

हाँ, मुझे पता है कि 'with' काम करता है, लेकिन वह नहीं' data.table' देशी तरीका है, जैसा कि आप बाहर बिंदु। = ', स्मृति अक्षमता हो सकता है वास्तव में': मुख्य जवाब – arvi1000

1

आप .SDcols उपयोग कर सकते हैं:

dat[, (cols) := lapply(.SD, factor), .SDcols=cols] 

:= का उपयोग करके: विकल्प का उपयोग करने के अलावा के रूप में मैट Dowle ने सुझाव दिया

dat[, cols] <- dat[, lapply(.SD, factor), .SDcols=cols]

+0

कोई कारण यह डाउनवॉट प्राप्त कर रहा है? ऐसा लगता है कि प्रश्नकर्ता – Chris

+1

की तलाश कर रहा है अन्य उत्तर पर मेरी टिप्पणी के समान। डेटाटेबल का उपयोग करने का एक बड़ा फायदा संदर्भ द्वारा संशोधन है, लेकिन जहां तक ​​मैं कह सकता हूं, '[<-' एक के साथ इसका लाभ उठाने में विफल रहता है। – Frank

+0

@ क्रिस लोग यहां "बहुत कम जवाब" दिशानिर्देश थोड़ा गंभीरता से लेते हैं। हालांकि विस्तार/विस्तार के लिए लगभग हमेशा कमरा है। – shadowtalker

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