2013-03-13 17 views
19

मैं डेटा फ्रेम को सब्सक्राइब करने का प्रयास कर रहा हूं, जहां मुझे एकाधिक कॉलम मानों के आधार पर एकाधिक डेटा फ्रेम मिलते हैं। यहाँ मेरी उदाहरण हैकई कॉलम मानों के आधार पर एकाधिक डेटा फ्रेमों में डेटा फ्रेम को सब्सक्राइब करना

>df 
    v1 v2 v3 v4 v5 
    A Z 1 10 12 
    D Y 10 12 8 
    E X 2 12 15 
    A Z 1 10 12 
    E X 2 14 16 

उम्मीद उत्पादन कुछ इस तरह है, जहां मैं स्तंभ v1 के आधार पर एक से अधिक डेटा फ्रेम में इस डेटा फ्रेम और v2

>df1 
v3 v4 v5 
    1 10 12 
    1 10 12 
>df2 
v3 v4 v5 
10 12 8 
>df3 
v3 v4 v5 
2 12 15 
2 14 16 

बंटवारे हूँ मैं एक कोड है जो काम कर रहा है लिखा है है अभी अभी नहीं सोचें कि ऐसा करने का सबसे अच्छा तरीका है। ऐसा करने का एक बेहतर तरीका होना चाहिए। मान लें कि tab डेटा.फ्रेम प्रारंभिक डेटा है। यहां मेरा कोड है:

v1Factors<-levels(factor(tab$v1)) 
v2Factors<-levels(factor(tab$v2)) 

for(i in 1:length(v1Factors)){ 
    for(j in 1:length(v2Factors)){ 
    subsetTab<-subset(tab, v1==v1Factors[i] & v2==v2Factors[j], select=c("v3", "v4", "v5")) 
    print(subsetTab) 
    } 
} 

क्या कोई उपर्युक्त करने के लिए एक बेहतर तरीका सुझा सकता है?

+0

क्या आप उन डेटाफ्रेम का पुन: उपयोग करना चाहते हैं, या बस उन स्तंभों द्वारा समूहित मुद्रित करना चाहते हैं? – Thilo

+0

मैं उनका पुन: उपयोग करना चाहता हूं .... उन डेटा फ्रेम पर आलेखों को साजिश करना चाहता हूं। –

उत्तर

23

आप के रूप में टिप्पणी में उल्लेख किया

निम्न में से किसी काम करेगा

library(microbenchmark) 
microbenchmark(
       split(df, list(df$v1,df$v2), drop = TRUE), 
       split(df, interaction(df$v1,df$v2), drop = TRUE), 
       split(df, with(df, interaction(v1,v2)), drop = TRUE)) 


Unit: microseconds 
                expr  min  lq median  uq  max neval 
      split(df, list(df$v1, df$v2), drop = TRUE) 1119.845 1129.3750 1145.8815 1182.119 3910.249 100 
    split(df, interaction(df$v1, df$v2), drop = TRUE) 893.749 900.5720 909.8035 936.414 3617.038 100 
split(df, with(df, interaction(v1, v2)), drop = TRUE) 895.150 902.5705 909.8505 927.128 1399.284 100 

ऐसा प्रतीत होता है interactionsplit

split(df, with(df, interaction(v1,v2)), drop = TRUE) 
$E.X 
    v1 v2 v3 v4 v5 
3 E X 2 12 15 
5 E X 2 14 16 

$D.Y 
    v1 v2 v3 v4 v5 
2 D Y 10 12 8 

$A.Z 
    v1 v2 v3 v4 v5 
1 A Z 1 10 12 

लिए देख रहे हैं थोड़ा तेजी से (शायद तथ्य यह है कि कारण है f = list(...) फ़ंक्शन के भीतर एक इंटरैक्शन में परिवर्तित हो गए हैं)


संपादित

तुम सिर्फ तब सबसेट data.frames का उपयोग मैं

library(data.table) 

dt <- data.table(df) 
dt[, plot(v4, v5), by = list(v1, v2)] 
+2

'विभाजन '' इंटरैक्शन' का उपयोग करने के बजाय 'f' के लिए एक सूची ले सकता है। सुनिश्चित नहीं है कि हालांकि अधिक कुशल कौन सा है। – A5C1D2H2I1M1N2O1R2T1

+0

@AnandaMahto - मैंने एक बेंचमार्क जोड़ा है। – mnel

+0

बेंचमार्क के लिए धन्यवाद। उस स्थिति में, @ अरुण की चाल ('के साथ (डीएफ, विभाजन (डीएफ, एफ = do.call (पेस्ट, डीएफ [1: 2])) 'शायद शायद तेज भी होगा! और, यह अनावश्यक स्तर नहीं बनाएगा इसे छोड़ने की जरूरत है। – A5C1D2H2I1M1N2O1R2T1

3

वहाँ अब कोडिंग में आसानी के लिए data.table का उपयोग कर सुझाव चाहते हैं भी nest()tidyr से जो नहीं बल्कि अच्छा है । nestdf$data[1] और इतने पर के साथ

library(tidyr) 
nestdf <- df %>% nest(v3:v5) 
nestdf$data 

> nestdf$data 
[[1]] 
# A tibble: 2 × 3 
    v3 v4 v5 
    <int> <int> <int> 
1  1 10 12 
2  1 10 12 

[[2]] 
# A tibble: 1 × 3 
    v3 v4 v5 
    <int> <int> <int> 
1 10 12  8 

[[3]] 
# A tibble: 2 × 3 
    v3 v4 v5 
    <int> <int> <int> 
1  2 12 15 
2  2 14 16 

पहुँच व्यक्ति tibbles।

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