R 如何迭代分组变量以计算一个或多个变量的平均值?

R 如何迭代分组变量以计算一个或多个变量的平均值?,r,R,示例数据如下所示 # mean by group variable (one at a time) dummy %>% group_by(location) %>% summarise(mean(length)) %>% spread(1,2) #> # A tibble: 1 x 4 #> `1` `2` `3` `5` #> <dbl> <dbl> <dbl> <dbl&

示例数据如下所示


# mean by group variable (one at a time)
dummy %>% 
  group_by(location) %>% 
  summarise(mean(length)) %>% 
  spread(1,2)
#> # A tibble: 1 x 4
#>     `1`   `2`   `3`   `5`
#>   <dbl> <dbl> <dbl> <dbl>
#> 1    15  36.7    35    20
库(tidyverse)
#资料
虚拟100万行。结果数据帧是我期望的输出

我试过用下面的方法(和其他几种变体)来做,但我真的不知道怎么做

# there must be a way doing it like this    
map_dfr(.x = dummy, 
        ~ group_by(.x) %>% 
          summarise(mean(length)) %>%
          spread(1,2)

由(v0.3.0)于2020年5月22日创建的一种方法是在末尾进行
转置
排列
,而不是在循环中进行此操作

library(dplyr)
library(tidyr)
library(data.table)
library(purrr)
map(names(dummy)[-1], ~ 
       dummy %>%
           select(length, .x) %>%
           group_by(group = !! rlang::sym(.x))%>% 
           summarise(Mean = mean(length)) %>% 
           ungroup) %>%
  reduce(full_join, by = 'group') %>% 
  data.table::transpose(., make.names = 'group')
#  1        2    3        5
#1 15 36.66667 35.0 20.00000
#2 45 25.00000 32.5 23.33333

或者是带有
pivot\u更长/pivot\u更宽的选项

library(tidyr)
pivot_longer(dummy, cols = -length) %>%   
    pivot_wider(names_from = value, values_from = length,
         values_fn = list(length = mean))
# A tibble: 2 x 5
#  name       `1`   `5`   `2`   `3`
#  <chr>    <dbl> <dbl> <dbl> <dbl>
#1 location    15  20    36.7  35  
#2 environ     45  23.3  25    32.5
或用于多个列

dummy$width <- dummy$length
pivot_longer(dummy, cols = -c(length, width)) %>%   
     pivot_wider(names_from = value, values_from = c(length, width),
          values_fn = list(length = mean, width = mean))
# A tibble: 2 x 9
#  name     length_1 length_5 length_2 length_3 width_1 width_5 width_2 width_3
#  <chr>       <dbl>    <dbl>    <dbl>    <dbl>   <dbl>   <dbl>   <dbl>   <dbl>
#1 location       15     20       36.7     35        15    20      36.7    35  
#2 environ        45     23.3     25       32.5      45    23.3    25      32.5
dcast(melt(setDT(dummy), id.vars = c('length', 'width')), 
        variable ~ value, value.var = c('length','width'), mean)
#   variable length_1 length_2 length_3 length_5 width_1  width_2 width_3  width_5
#1: location       15 36.66667     35.0 20.00000      15 36.66667    35.0 20.00000
#2:  environ       45 25.00000     32.5 23.33333      45 25.00000    32.5 23.33333

一种方法是在末尾进行
转置
扩展
,而不是在循环中执行此操作

library(dplyr)
library(tidyr)
library(data.table)
library(purrr)
map(names(dummy)[-1], ~ 
       dummy %>%
           select(length, .x) %>%
           group_by(group = !! rlang::sym(.x))%>% 
           summarise(Mean = mean(length)) %>% 
           ungroup) %>%
  reduce(full_join, by = 'group') %>% 
  data.table::transpose(., make.names = 'group')
#  1        2    3        5
#1 15 36.66667 35.0 20.00000
#2 45 25.00000 32.5 23.33333

或者是带有
pivot\u更长/pivot\u更宽的选项

library(tidyr)
pivot_longer(dummy, cols = -length) %>%   
    pivot_wider(names_from = value, values_from = length,
         values_fn = list(length = mean))
# A tibble: 2 x 5
#  name       `1`   `5`   `2`   `3`
#  <chr>    <dbl> <dbl> <dbl> <dbl>
#1 location    15  20    36.7  35  
#2 environ     45  23.3  25    32.5
或用于多个列

dummy$width <- dummy$length
pivot_longer(dummy, cols = -c(length, width)) %>%   
     pivot_wider(names_from = value, values_from = c(length, width),
          values_fn = list(length = mean, width = mean))
# A tibble: 2 x 9
#  name     length_1 length_5 length_2 length_3 width_1 width_5 width_2 width_3
#  <chr>       <dbl>    <dbl>    <dbl>    <dbl>   <dbl>   <dbl>   <dbl>   <dbl>
#1 location       15     20       36.7     35        15    20      36.7    35  
#2 environ        45     23.3     25       32.5      45    23.3    25      32.5
dcast(melt(setDT(dummy), id.vars = c('length', 'width')), 
        variable ~ value, value.var = c('length','width'), mean)
#   variable length_1 length_2 length_3 length_5 width_1  width_2 width_3  width_5
#1: location       15 36.66667     35.0 20.00000      15 36.66667    35.0 20.00000
#2:  environ       45 25.00000     32.5 23.33333      45 25.00000    32.5 23.33333

您可以获取长格式的数据,按组计算
平均值
,并获取宽格式的数据

library(dplyr)
library(tidyr)

pivot_longer(dummy, cols = -length) %>%
   group_by(name, value) %>%
   summarise(length = mean(length)) %>%
   pivot_wider(names_from = value, values_from = length)


#  name       `1`   `2`   `3`   `5`
#  <chr>    <dbl> <dbl> <dbl> <dbl>
#1 environ     45  25    32.5  23.3
#2 location    15  36.7  35    20  

您可以获取长格式的数据,按组计算
平均值
,并获取宽格式的数据

library(dplyr)
library(tidyr)

pivot_longer(dummy, cols = -length) %>%
   group_by(name, value) %>%
   summarise(length = mean(length)) %>%
   pivot_wider(names_from = value, values_from = length)


#  name       `1`   `2`   `3`   `5`
#  <chr>    <dbl> <dbl> <dbl> <dbl>
#1 environ     45  25    32.5  23.3
#2 location    15  36.7  35    20  

tidyverse
中有任何解决方案吗?这对我来说也是一个学习的机会。我在
base R
中确实有一个有效的解决方案,按照您的建议使用
sapply
tapply
。@akrun,我知道在df上循环会产生向量,我想知道是否有办法将该向量用作分组变量?在
tidyverse
中有解决方案吗?这对我来说也是一个学习的机会。我在
base R
中确实有一个有效的解决方案,按照您的建议使用
sapply
tapply
。@akrun,我知道在df上循环会产生向量,我想知道是否有办法将该向量用作分组变量?这很好。这是我一直在思考和尝试做的事情,但不知道如何做到。出于提高速度的目的,
tidyverse
解决方案在这一点上非常快。您可以从
pivot\u更宽的
中的
values\u参数中列出多个列,这一点非常好。这解决了我的两个问题。这很好。这是我一直在思考和尝试做的事情,但不知道如何做到。出于提高速度的目的,
tidyverse
解决方案在这一点上非常快。您可以从
pivot\u更宽的
中的
values\u参数中列出多个列,这一点非常好。这解决了我的两个问题。它看起来更好,可读性更好。现在,如果我有多个变量,这怎么能扩展到?假设我还有
width
。如何计算长度和宽度的平均值?在@Ronak的回答中,我可以通过在
总结
步骤中加入另一个术语来实现。如何使用
pivot\u wide
中的
values\u fn
参数执行此操作?它看起来更好,可读性更好。现在,如果我有多个变量,这怎么能扩展到?假设我还有
width
。如何计算长度和宽度的平均值?在@Ronak的回答中,我可以通过在
总结
步骤中加入另一个术语来实现。如何使用
pivot\u wide
中的
values\u fn
参数执行此操作?