2013-05-20 9 views
34

में एक पंक्ति सम्मिलित करें अगर मैं एक डेटा फ्रेमएक data.table

set.seed(12345) 
df=data.frame(a=rnorm(5),b=rnorm(5)) 

है मैं जैसे द्वारा एक पंक्ति में जोड़ सकते हैं

df[6,] =c(5,6)

अब मैं data.table

library(data.table) 
dt=data.table(df) 
dt[6,]=c(5,6) 

यह एक त्रुटि के साथ विफल में बराबर करते हैं। डेटा.table में पंक्ति डालने का सही तरीका क्या है?

+2

मुझे लगता है कि इस पैकेज के लिए पंक्तियों को जोड़ने के लिए अपेक्षाकृत तेज़ बनाने के लिए 'डालने()' फ़ंक्शन की योजना बनाई गई है, लेकिन अभी तक, आपको डेटा तालिका के 'nrow' को पूर्वस्थापित करना होगा। शायद यह: http://r-forge.r-project.org/tracker/index.php?func=detail&aid=1458&group_id=240&atid=978 – Frank

+8

'rbind (डीटी, सूची (5,6))' आपके लिए पर्याप्त है उद्देश्य? – Roland

+2

btw ime हर बार जब मैंने सोचा कि मुझे पंक्ति से डेटा पंक्ति जोड़ने की ज़रूरत है, तो मैं सी-स्टाइल सोच रहा था और आर-स्टाइल नहीं - इसलिए उपर्युक्त टिप्पणियों से अलग आपको पुनर्विचार करना चाहिए कि आपको वास्तव में यह करने की आवश्यकता है या नहीं – eddi

उत्तर

36

@Franks जवाब पर विस्तार करने के लिए, अपने विशेष मामले में अगर आप एक पंक्ति जोड़कर रहे हैं, यह है:

set.seed(12345) 
dt1 <- data.table(a=rnorm(5), b=rnorm(5)) 

निम्नलिखित बराबर हैं;

microbenchmark(
    rbind(dt1, list(5, 6)), 
    rbindlist(list(dt1, list(5, 6)))   
) 

हम देख सकते हैं: मैं पहली बार पढ़ने में आसान लेकिन दूसरे आसानी से ढूंढा जा

       expr  min  lq median  uq  max 
      rbind(dt1, list(5, 6)) 160.516 166.058 175.089 185.1470 457.735 
rbindlist(list(dt1, list(5, 6))) 130.137 134.037 140.605 149.6365 184.326 

आप पंक्ति कहीं और सम्मिलित करना चाहते हैं, तो निम्नलिखित काम करेंगे, लेकिन यह बहुत नहीं है:

rbindlist(list(dt1[1:3, ], list(5, 6), dt1[4:5, ])) 

या यहाँ तक कि

rbindlist(list(dt1[1:3, ], as.list(c(5, 6)), dt1[4:5, ])) 

देने:

  a   b 
1: 0.5855288 -1.8179560 
2: 0.7094660 0.6300986 
3: -0.1093033 -0.2761841 
4: 5.0000000 6.0000000 
5: -0.4534972 -0.2841597 
6: 0.6058875 -0.9193220 

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

dt1 <- data.table(a=rnorm(6), b=rnorm(6)) 
set(dt1, i=6L, j="a", value=5) # refer to column by name 
set(dt1, i=6L, j=2L, value=6) # refer to column by number 

धन्यवाद अग्रिम में data.table के आकार को परिभाषित करने की आवश्यकता होगी संशोधित रहे हैं, तो @ बॉक्सुआन, मैंने आपके सुझाव का विवरण लेने के लिए इस उत्तर को संशोधित किया है, जो पढ़ने के लिए थोड़ा तेज़ और आसान है।

+1

'rbindlist (सूची (डीटी 1, सूची (5,6)) का उपयोग क्यों नहीं करें) 'थोड़ा बेहतर पठनीयता के लिए आपका दूसरा विकल्प के रूप में? – Boxuan

+1

@ बोक्सुआन 'rbindlist (सूची (डीटी 1, सूची (सी (5, 6))) 'मुझे' त्रुटि देता है ... आइटम 2 में 1 कॉलम हैं, आइटम 1 के साथ असंगत है जिसमें 2 कॉलम हैं ... 'से आउटपुट देखें 'सूची (सी (5, 6)) ', जो एक तत्व बनाम' as.list (सी (5, 6)) वाली एक सूची है, जिसमें दो हैं। – dardisco

+0

यह अजीब बात है। मैं इसे अपनी मशीन पर चलाने में सक्षम हूं। शायद हमारे पास अलग-अलग संस्करण हैं? 'पैकेजवर्सन (" डेटाटेबल ") 'मुझे' [1] '1.9.4' 'देता है और' getRversion() 'मुझे' [1] '3.2.0'' देता है। – Boxuan

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