【发布时间】:2020-06-19 13:27:23
【问题描述】:
我有一个数据框,里面有 3 个数值变量。我需要计算这些数值变量的一些参数,例如均值、中位数、标准差、峰度。然后我需要把它安排在一个数据框中。因此,该数据框的第一列将包含所有数字变量名称,第二列将包含所有平均值,第三列将包含所有中值,依此类推。如何实现?我熟悉dplyr 包。那么有什么建议吗?
【问题讨论】:
标签: r
我有一个数据框,里面有 3 个数值变量。我需要计算这些数值变量的一些参数,例如均值、中位数、标准差、峰度。然后我需要把它安排在一个数据框中。因此,该数据框的第一列将包含所有数字变量名称,第二列将包含所有平均值,第三列将包含所有中值,依此类推。如何实现?我熟悉dplyr 包。那么有什么建议吗?
【问题讨论】:
标签: r
您可以将summarise 与across 一起使用:
library(dplyr)
library(tidyr)
mtcars %>%
select(1:3) %>%
summarise(across(where(is.numeric), list(mean = mean, std = sd, med = median)))
# mpg_mean mpg_std mpg_med cyl_mean cyl_std cyl_med disp_mean disp_std disp_med
#1 20.09062 6.026948 19.2 6.1875 1.785922 6 230.7219 123.9387 196.3
在老版本的dplyr中,可以使用summarise_if:
mtcars %>%
select(1:3) %>%
summarise_if(is.numeric, list(mean = mean, std = sd, med = median))
您可以在上面的答案中添加pivot_longer 以获取所需格式的数据。
mtcars %>%
select(1:3) %>%
summarise(across(where(is.numeric),list(mean=mean,std=sd,med = median))) %>%
pivot_longer(cols = everything(),
names_to = c('col', '.value'),
names_sep = '_')
# A tibble: 3 x 4
# col mean std med
# <chr> <dbl> <dbl> <dbl>
#1 mpg 20.1 6.03 19.2
#2 cyl 6.19 1.79 6
#3 disp 231. 124. 196.
或者你可以先旋转然后进行计算:
mtcars %>%
select(1:3) %>%
pivot_longer(cols = everything()) %>%
group_by(name) %>%
summarise(mean = mean(value), std = sd(value), med = median(value))
【讨论】:
across,但格式不是我想要的。它只给出一行。我想要第一列中的所有变量名称,然后第二列中的所有平均值和第三列中的所有中值等等。