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
参数执行此操作?