2015-01-10 12 views
18

मैं डेटा के एकाधिक कॉलम पर फ़ंक्शन लागू करने के लिए dplyr के summarise_each का उपयोग कर रहा हूं। एक बात यह है कि यह अच्छा है कि आप एक साथ कई कार्यों को लागू कर सकते हैं। बात यह है कि यह परेशान है कि आउटपुट एक पंक्ति के साथ डेटाफ्रेम है। ऐसा लगता है कि इसे कई पंक्तियों को फ़ंक्शन के रूप में वापस करना चाहिए, जिसमें स्तंभों के रूप में कई कॉलम सारांशित किए गए थे।प्रति कार्य एक पंक्ति वापस करने के लिए dplyr की summarise_each का उपयोग करें?

library(dplyr) 
default <- 
    iris %>% 
    summarise_each(funs(min, max), matches("Petal")) 

इस रिटर्न

> default 
    Petal.Length_min Petal.Width_min Petal.Length_max Petal.Width_max 
1    1    0.1    6.9    2.5 

मैं की तरह

library(reshape2) 
desired <- 
    iris %>% 
    select(matches("Petal")) %>% 
    melt() %>% 
    group_by(variable) %>% 
    summarize(min=min(value),max=max(value)) %>% 
    t() 

जो कुछ बंद रिटर्न कुछ पसंद करते हैं (न कि किसी dataframe, लेकिन आप सभी विचार प्राप्त)

> desired 
     [,1]   [,2]   
variable "Petal.Length" "Petal.Width" 
min  "1.0"   "0.1"   
max  "6.9"   "2.5" 

सारांश में कोई विकल्प है ऐसा करने के लिए se_each? यदि नहीं, हैडली, क्या आप इसे जोड़ना चाहते हैं?

उत्तर

22

आप dplyr और tidyr संकुल के संयोजन एक ऐसी ही उत्पादन प्राप्त कर सकते हैं। इन पंक्तियों के साथ कुछ मदद कर सकते हैं

library(dplyr) 
library(tidyr) 

iris %>% 
    select(matches("Petal")) %>% 
    summarise_each(funs(min, max)) %>% 
    gather(variable, value) %>% 
    separate(variable, c("var", "stat"), sep = "\\_") %>% 
    spread(var, value) 
## stat Petal.Length Petal.Width 
## 1 max   6.9   2.5 
## 2 min   1.0   0.1 
+2

ठंडा, और थोड़ा छोटा (डिफ़ॉल्ट मानों के साथ) '%%>% अलग (कुंजी, सी (" कुंजी "," स्टेट "), sep =" _ ")%>% प्रसार (कुंजी, मान)' – ckluss

+0

@lluss नाइस, धन्यवाद। इसे अद्यतन करने के उत्तर को संपादित करने के लिए स्वतंत्र महसूस करें। – dickoa

+0

बहुत अच्छा। मुझे अंततः tidyr में गोता लगाने का एक कारण देता है। बहुत धन्यवाद। –

6

मेरे ज्ञान के लिए ऐसा कोई तर्क नहीं है। किसी भी तरह, यहां एक कामकाज है जो साफ डेटा को आउटपुट करता है, मुझे लगता है कि कार्यों के रूप में कई पंक्तियों और संक्षेप में कॉलम के रूप में कई कॉलम होने से भी बेहतर होगा। (ध्यान दें कि add_rownamesdplyr 0.4.0 की आवश्यकता है)

library("dplyr") 
library("tidyr") 

iris %>% 
    summarise_each(funs(min, max, mean, median), matches("Petal")) %>% 
    t %>% 
    as.data.frame %>% 
    add_rownames %>% 
    separate(rowname, into = c("feature", "fun"), sep = "_") 

रिटर्न:

 feature fun  V1 
1 Petal.Length min 1.000000 
2 Petal.Width min 0.100000 
3 Petal.Length max 6.900000 
4 Petal.Width max 2.500000 
5 Petal.Length mean 3.758000 
6 Petal.Width mean 1.199333 
7 Petal.Length median 4.350000 
8 Petal.Width median 1.300000 
+0

मैं इस प्रारूप को कई स्थितियों में उपयोगी देख सकता हूं। धन्यवाद! –

+0

छोटे पैडेंटिक नोट: 'add_rownames()' अब बहिष्कृत किया गया है और सुझाव इसके बजाय 'tibble :: rownames_to_column()' का उपयोग करना है। –

2

एक विकल्प (साथ bind_cols हालांकि map_df अब के लिए ठीक है वास्तव में map_dfc एक data.frame वापस करने के लिए आसान बनाने के लिए) एक समारोह है कि के परिणामों का एक वेक्टर बनाता है साथ purrr::map_df उपयोग करने के लिए है प्रत्येक समारोह, यानी

library(tidyverse) 

iris %>% select(contains('Petal')) %>% 
    map_dfc(~c(min(.x), max(.x))) %>% 
    mutate(stat = c('min', 'max')) # to add column of function names 

#> # A tibble: 2 × 3 
#> Petal.Length Petal.Width stat 
#>   <dbl>  <dbl> <chr> 
#> 1   1.0   0.1 min 
#> 2   6.9   2.5 max 
+0

'purrr' के नए संस्करण के लिए' dmap' -> 'map_df' बदलें, प्रति [tidyverse news] (http://purrr.tidyverse.org/news/#purrr-and-dplyr) – Paul

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