2012-04-03 17 views
11

मेरे पास बड़ा डेटासेट है (लेकिन उदाहरण के लिए निम्न छोटा है)। मैं डेटाफ्रेम को विभाजित कर सकता हूं और फिर मैं विभाजित करने के लिए उपयोग किए जाने वाले लैवेल से संबंधित एकाधिक टेक्स्ट फ़ाइल में आउटपुट करना चाहता हूं।एकाधिक आउटपुट फ़ाइलों में डेटाफ्रेम विभाजित करें

mydata <- data.frame (var1 = rep(c("k", "l", "c"), each = 5), var2 = rnorm(5), 
     var3 = rnorm(5)) 
mydata  
    var1  var2  var3 
1  k 0.5406022 0.3654706 
2  k -0.6356879 -0.9160001 
3  k 0.2946240 -0.1072241 
4  k -0.2609121 0.1036626 
5  k 0.6206579 0.6111655 
6  l 0.5406022 0.3654706 
7  l -0.6356879 -0.9160001 
8  l 0.2946240 -0.1072241 
9  l -0.2609121 0.1036626 
10 l 0.6206579 0.6111655 
11 c 0.5406022 0.3654706 
12 c -0.6356879 -0.9160001 
13 c 0.2946240 -0.1072241 
14 c -0.2609121 0.1036626 
15 c 0.6206579 0.6111655 

अब

> spt1 <- split(mydata, mydata$var1) 

> spt1 

$c 
    var1  var2  var3 
11 c 0.5406022 0.3654706 
12 c -0.6356879 -0.9160001 
13 c 0.2946240 -0.1072241 
14 c -0.2609121 0.1036626 
15 c 0.6206579 0.6111655 

$k 
    var1  var2  var3 
1 k 0.5406022 0.3654706 
2 k -0.6356879 -0.9160001 
3 k 0.2946240 -0.1072241 
4 k -0.2609121 0.1036626 
5 k 0.6206579 0.6111655 

$l 
    var1  var2  var3 
6  l 0.5406022 0.3654706 
7  l -0.6356879 -0.9160001 
8  l 0.2946240 -0.1072241 
9  l -0.2609121 0.1036626 
10 l 0.6206579 0.6111655 

मैं outputc, outputk, और outputl के नाम पर write.table करना चाहते हैं अलग हो गए। इस प्रकार आउटपुट सामान्य उपसर्ग है जिसके बाद समूह चर के लिए लेबल का नाम है।

write.table (spt1) 

उत्तर

12

spt1 के नाम से अधिक lapply का उपयोग करते हुए हमें spt1 में dataframes और नाम है कि हम पेस्ट में उपयोग हमारी फ़ाइलें बनाने के लिए कर सकते हैं का उपयोग करने की अनुमति देगा।

lapply(names(spt1), function(x){write.table(spt1[[x]], file = paste("output", x, sep = ""))}) 

यदि आप चाहें तो पेस्ट में एक सामान्य एक्सटेंशन जोड़ सकते हैं।

5

आप वास्तव में तेजी से data.table समाधान का भी उपयोग कर सकते हैं। इस मामले में, dataframe को list में विभाजित करने की आवश्यकता नहीं है।

library(data.table) # v1.9.7 (devel version) 

setDT(mydata) # convert your dataframe into a data.table 

# save files 
    mydata[, fwrite(.SD, paste0("output", var1,".csv")), by = var1] 

मामले में आप आउटपुट में var1 रखना चाहते हैं, तो आप ऐसा कर सकते हैं:

mydata[, fwrite(copy(.SD)[, var1 := var1] paste0("output", var1,".csv")), by = var1] 

ps। ध्यान दें कि यह उत्तर fwrite का उपयोग करता है, जो अभी भी data.table के विकास संस्करण में है। Go here for install instructions। आप बस write.csv या write.table का उपयोग कर सकते हैं, हालांकि यदि आप एक बड़े डेटासेट से निपट रहे हैं और fwrite निश्चित रूप से one of the fastest alternatives है तो आप शायद तेज़ समाधान चाहते हैं।

+1

शायद ध्यान देने योग्य भी है: ओपी आउटपुट में 'var1' बनाए रखना चाहता है लेकिन 'एसडी' में यह शामिल नहीं है। आप 'सी (.BY, .SD) '(यह सुनिश्चित नहीं कर सकते हैं कि यह काम करता है) या नई' split.data.table' विधि का उपयोग करें (वर्तमान में डेवेल संस्करण https://github.com/Rdatatable/data में। टेबल/मुद्दे/1389) – Frank

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