首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用dplyr的summarise_each为每个函数返回一行?

使用dplyr的summarise_each为每个函数返回一行?
EN

Stack Overflow用户
提问于 2015-01-11 02:23:53
回答 3查看 4.6K关注 0票数 20

我正在使用dplyr的summarise_each将一个函数应用于多个数据列。一件很好的事情是你可以一次应用多个函数。问题是,令人恼火的是,输出是一个只有一行的数据帧。它似乎应该返回与函数一样多的行,以及与汇总的列一样多的列。

代码语言:javascript
复制
library(dplyr)  
default <- 
  iris %>% 
  summarise_each(funs(min, max), matches("Petal"))

这将返回

代码语言:javascript
复制
> default
  Petal.Length_min Petal.Width_min Petal.Length_max Petal.Width_max
1                1             0.1              6.9             2.5

我更喜欢像这样的

代码语言:javascript
复制
library(reshape2)
desired <- 
  iris %>% 
  select(matches("Petal")) %>% 
  melt() %>% 
  group_by(variable) %>% 
  summarize(min=min(value),max=max(value)) %>%
  t()

它返回一些接近的东西(不是数据帧,但您都明白了)

代码语言:javascript
复制
> desired
         [,1]           [,2]         
variable "Petal.Length" "Petal.Width"
min      "1.0"          "0.1"        
max      "6.9"          "2.5" 

在summarise_each中有这样做的选项吗?如果没有,哈德利,你介意加上吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-01-11 03:36:15

您可以结合使用dplyrtidyr包来获得类似的输出。这些方面的一些东西可能会有所帮助

代码语言:javascript
复制
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
票数 24
EN

Stack Overflow用户

发布于 2015-01-11 03:21:30

据我所知,没有这样的争论。无论如何,这里有一个可以输出整洁数据的变通方法,我认为这会比拥有与函数一样多的行和与汇总列一样多的列更好。(请注意,add_rownames需要dplyr 0.4.0)

代码语言:javascript
复制
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 = "_")

返回:

代码语言:javascript
复制
       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
票数 7
EN

Stack Overflow用户

发布于 2016-09-20 13:15:54

一种选择是使用purrr::map_df (实际上是map_dfc,通过bind_cols简化为data.frame,尽管map_df目前还不错),该函数生成每个函数的结果向量,即

代码语言:javascript
复制
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
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27879638

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档