2015-11-18 10 views
14

मेरे पास एक बड़ा डेटासेट है जो आर में split() चुटकता है। मैं dplyr group_by (जो वैसे भी पसंदीदा तरीका है) का उपयोग करने में सक्षम हूं लेकिन मैं लगातार बने रहने में असमर्थ हूं परिणामी grouped_df डेटा फ्रेम की सूची के रूप में, मेरे लगातार प्रोसेसिंग चरणों द्वारा आवश्यक एक प्रारूप (मुझे SpatialDataFrames और इसी तरह के लिए मजबूर होना आवश्यक है)।dplyr group_by के साथ अनुकरण स्प्लिट(): डेटा फ्रेम की एक सूची लौटाएं

एक नमूना डेटासेट पर विचार करें:

df = as.data.frame(cbind(c("a","a","b","b","c"),c(1,2,3,4,5), c(2,3,4,2,2))) 
listDf = split(df,df$V1) 

रिटर्न

$a 
    V1 V2 V3 
1 a 1 2 
2 a 2 3 

$b 
    V1 V2 V3 
3 b 3 4 
4 b 4 2 

$c 
    V1 V2 V3 
5 c 5 2 

मैं साथ group_by (group_by(df,V1) की तरह कुछ) इस अनुकरण करने के लिए चाहते हैं, लेकिन यह एक, grouped_df देता है। मुझे पता है कि do मेरी मदद करने में सक्षम होना चाहिए, लेकिन मैं उपयोग को लेकर अनिश्चित हूं (यह भी एक चर्चा के लिए link देखें।)

ध्यान दें कि ऐसे नाम हैं जो इस समूह की स्थापना के लिए इस्तेमाल किया गया है कारक के नाम से प्रत्येक सूची विभाजित - यह एक वांछित कार्य है (अंत में, इन नामों को डीएफएस की सूची से निकालने के लिए बोनस कुडोस)।

+4

क्यों है '' split' अधिक पसंद group_by'? क्योंकि यह हैडली द्वारा लिखा गया था? 'group_by' में यह स्थान है और इसे डेटा सेट को अलग-अलग डेटा फ्रेम में विभाजित करने के लिए डिज़ाइन नहीं किया गया है, जबकि 'स्प्लिट' को ठीक से प्राप्त करने के लिए डिज़ाइन किया गया है। –

+2

नहीं, क्योंकि यह हैडली द्वारा लिखा गया था, लेकिन क्योंकि यह पूरा करता है - और तेज़। मेरे पास एक डेटासेट है जो 400 एमबी का डीएफ है, और एक monstrosity में विभाजित परिणाम (सुनिश्चित नहीं है कि यह आकार क्यों फुलाता है), और बचत करते समय आर दुर्घटनाग्रस्त हो जाता है। यह एक प्रशिक्षण डेटासेट है, असली एक 8.5 जीबी डेटासेट (1 जीबी आरडीएटा के रूप में) है। समूह काम किया, विभाजित विफल रहा। मैंने bigsplit की कोशिश की, लेकिन यह काम करने के लिए प्रबंधन नहीं किया था। फिर भी, सवाल पर वापस - group_by (और dplyr) के साथ ऐसा कैसे करें? – MartinT

+1

फिर, 'group_by' को डेटा सेट को अलग करने के लिए डेटा सेट को विभाजित करने के लिए डिज़ाइन नहीं किया गया था। 'डू' शायद 'स्प्लिट' से बहुत धीमी होगी। 'विभाजन 'पूरी तरह से सदिश और संकलित कार्य है और मुझे नहीं लगता कि यह किसी अन्य विकल्प की तुलना में धीमा क्यों होगा। –

उत्तर

12

'छड़ी' करने के लिए dplyr लिए, आप भी plyrsplit के बजाय का उपयोग कर सकते हैं: के रूप में आप नया स्तंभ नाम के रूप में लंबे do का उपयोग कर group_by से

library(plyr) 

dlply(df, "V1", identity) 
#$a 
# V1 V2 V3 
#1 a 1 2 
#2 a 2 3 

#$b 
# V1 V2 V3 
#1 b 3 4 
#2 b 4 2 

#$c 
# V1 V2 V3 
#1 c 5 2 
+13

' प्लीयर 'का उपयोग कैसे करें' dplyr' 'के साथ चिपक रहा है? –

+2

आपको बहुत धन्यवाद। यह वही परिणाम देता है जो मैं चाहता था, और तेज़ी से पूरा करता हूं। मैं इसे उचित उत्तर के रूप में चिह्नित नहीं करूंगा क्योंकि मैं इसे उचित उत्तर के रूप में चिह्नित नहीं करूंगा अभी भी दिलचस्पी है कि group_by का परिणाम डेटा फ्रेम की सूची के रूप में कैसे निर्यात किया जा सकता है, लेकिन धन्यवाद - आपने मेरी समस्या हल कर ली है और मैंने कुछ सीखा है! दिलचस्प बात यह है कि 380 एमबी डेटासेट से, परिणाम 340 जीबी सूची होने का दावा करता है! उम्मीद है कि मैं इसे बचा सकता हूं, अजीब लगता है - लेकिन यह लगभग 5 मिनट में बहुत तेज़ हो जाता है। – MartinT

+0

एक ही संरचित समस्या थी और 'my.data%>% group_by (कोला 'के माध्यम से नहीं जा सका)%>% करें (। , function.that.returns.list) 'क्योंकि' dplyr' परिणामों को 'data.frame' में वापस आने की अपेक्षा करता है। अपने apporach का उपयोग पूरी तरह से 'परिणाम <- dlply (my.data, "कोला", function.that.returns.list) ' – davidski

6

आप डेटा फ्रेम की एक सूची प्राप्त कर सकते हैं जहां डाटा फ्रेम संग्रहीत किए जाएंगे और फिर उस कॉलम को lapply में पाइप करें।

listDf = df %>% group_by(V1) %>% do(vals=data.frame(.)) %>% select(vals) %>% lapply(function(x) {(x)}) 
listDf[[1]] 
#[[1]] 
# V1 V2 V3 
#1 a 1 2 
#2 a 2 3 

#[[2]] 
# V1 V2 V3 
#1 b 3 4 
#2 b 4 2 

#[[3]] 
# V1 V2 V3 
#1 c 5 2 
+2

, आप' do (vals = data.frame (।)) ''Nest()' से बदल सकते हैं। 'vals' को डिफ़ॉल्ट रूप से 'डेटा'' नाम दिया जाएगा – aurelien

+0

नोट करें कि' do' के स्थान पर 'घोंसला() 'का उपयोग करना वही बात नहीं है; परिणामी तालिकाओं में केवल कॉलम V2 और V3 हैं; ग्रुपिंग चर खो गया है। – cboettig

+5

एक समान लेकिन थोड़ा छोटा संस्करण होगा: 'df%>% group_by (V1)%>% do (data = (।))%>% चयन (डेटा)%>% मानचित्र (पहचान)' – cboettig

7

आधार, plyr और dplyr समाधान की तुलना करना, यह अभी भी आधार एक बहुत तेजी से है लगता है!

df <- data_frame(Group1=rep(LETTERS, each=1000), 
      Group2=rep(rep(1:10, each=100),26), 
      Value=rnorm(26*1000)) 

library(plyr) 
library(dlyr) 
library(dlyr) 

microbenchmark(Base=df %>% 
      split(.$Group2, .$Group1), 
      dplyr=df %>% 
      group_by(Group1, Group2) %>% 
      do(data = (.)) %>% 
      select(data) %>% 
      lapply(function(x) {(x)}) %>% .[[1]], 
      plyr=dlply(df, c("Group1", "Group2"), as.tbl), 
      times=50) 

देता है:

Unit: milliseconds 
    expr  min  lq  mean median  uq  max neval 
    Base 1.898213 1.977818 2.056877 2.032882 2.077582 2.729119 50 
dplyr 30.967926 31.502983 33.289824 32.029863 33.135550 48.245150 50 
    plyr 47.702301 49.033336 51.915533 50.961585 54.407141 65.961197 50 
संबंधित मुद्दे