2017-04-05 8 views
5

क्या यह group_by है जो dplyr का उपयोग करके कॉलम नामों पर रेगेक्स मैच का उपयोग कर संभव है?कुल गतिशील कॉलम नाम से समूह

library(dplyr) # dplyr_0.5.0; R version 3.3.2 (2016-10-31) 

# dummy data 
set.seed(1) 
df1 <- sample_n(iris, 20) %>% 
    mutate(Sepal.Length = round(Sepal.Length), 
     Sepal.Width = round(Sepal.Width)) 

समूह स्थिर संस्करण से (लग रहा है/ठीक काम करता है, कल्पना अगर हम 10-20 कॉलम):

df1 %>% 
    group_by(Sepal.Length, Sepal.Width) %>% 
    summarise(mySum = sum(Petal.Length)) 

समूह गतिशील द्वारा - "बदसूरत" संस्करण:

df1 %>% 
    group_by_(.dots = colnames(df1)[ grepl("^Sepal", colnames(df1))]) %>% 
    summarise(mySum = sum(Petal.Length)) 

आदर्श रूप से, ऐसा कुछ (काम नहीं करता है, starts_with सूचकांक देता है):

df1 %>% 
    group_by(starts_with("Sepal")) %>% 
    summarise(mySum = sum(Petal.Length)) 
Error in eval(expr, envir, enclos) : 
    wrong result size (0), expected 20 or 1 

अपेक्षित उत्पादन:

# Source: local data frame [6 x 3] 
# Groups: Sepal.Length [?] 
# 
# Sepal.Length Sepal.Width mySum 
#   <dbl>  <dbl> <dbl> 
# 1   4   3 1.4 
# 2   5   3 10.9 
# 3   6   2 4.0 
# 4   6   3 43.7 
# 5   7   3 15.7 
# 6   8   4 6.4 

नोट: लगता है बहुत ज्यादा एक दोहराया पोस्ट की तरह, कृपया प्रासंगिक पोस्ट लिंक यदि कोई हो।

+0

'DF1%>% group_by _ (डॉट्स = ग्रेप ("^बाह्यदल ", नाम(), मूल्य = TRUE)) '? –

+0

@ डॉकेंडोडिस्किमस हां, मेरे बदसूरत संस्करण का थोड़ा सा सुंदर संस्करण। – zx8754

+0

मुझे लगता है कि यह 'start_with' के साथ काम नहीं करता है क्योंकि' group_by' को चरित्र इनपुट की आवश्यकता होती है जबकि 'start_with' कॉलम के सूचकांक –

उत्तर

6

यह सुविधा लागू किया जाएगा से छुटकारा मिलता है भविष्य के रिलीज में, संदर्भ GitHub issue #2619:

समाधान group_by_at समारोह का उपयोग करने के होगा:

df1 %>% 
    group_by_at(vars(starts_with("Sepal"))) %>% 
    summarise(mySum = sum(Petal.Length)) 

संपादित करें:।। यह अब dplyr_0.7.1 में कार्यान्वित किया जाता

1

अगर आप सिर्फ dplyr कार्यों के साथ रखना चाहते हैं, तो आप की कोशिश कर सकते हैं:

df1 %>% 
    group_by_(.dots = df1 %>% select(contains("Sepal")) %>% colnames()) %>% 
    summarise(mySum = sum(Petal.Length)) 

हालांकि यह जरूरी नहीं खूबसूरत है, लेकिन यह regex

+3

ओच, यह मेरे संस्करण से भी बदतर दिखता है। इरादा रेगेक्स से छुटकारा पाने के लिए नहीं है, लेकिन यह पता लगाने के लिए कि "ऐसा करने का" उचित "तरीका है या नहीं। – zx8754

+0

हाँ। मुझे दर्द महसूस होता है। हमें इसे शुरू करने के लिए इस तरह से घोंसला करने की आवश्यकता नहीं है। – Aramis7d

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