计算数据框中给定变量的均值和标准差
Calculate mean and sd for given variables in a dataframe
给定数据框中数值变量名称的向量,我需要计算每个变量的均值和标准偏差。例如,给定 mtcars
数据集和以下变量名称向量:
vars_to_transform <- c("mpg", "disp")
我想要以下结果:
我想到的第一个解决方案如下:
library(dplyr)
library(purrr)
data("mtcars")
vars_to_transform <- c("mpg", "disp")
vars_to_transform %>%
map_dfr( function(x) { c(variable = x, avg = mean(mtcars[[x]], na.rm = T), sd = sd(mtcars[[x]], na.rm = T)) } )
结果如下:
如您所见,所有返回的变量都是字符,但我希望 avg
和 sd
有数字。
有办法解决这个问题吗?或者还有比这更好的解决方案吗?
P.S。
我正在使用 purr
0.3.4
以下工作(而不是在代码中使用 c()
,使用 tibble
):
vars_to_transform %>%
map_dfr(~ tibble(variable = .x, avg = mean(mtcars[[.x]], na.rm = T),
sd = sd(mtcars[[.x]], na.rm = T)))
解释: 对于 c()
,您使用的是向量,其元素 必须 具有相同的类型(character
在你的例子中,因为 variable
是 character
)。使用 tibble
,每个元素可以有不同的类型。
@Gwang-Jin Kim 在我感谢的评论中建议,也可以使用 list
而不是 tibble
。
或尝试添加 type.convert
:
library(dplyr)
library(purrr)
data("mtcars")
vars_to_transform <- c("mpg", "disp")
vars_to_transform %>%
map_dfr( function(x) { c(variable = x, avg = mean(mtcars[[x]], na.rm = T), sd = sd(mtcars[[x]], na.rm = T)) } ) %>%
type.convert(as.is=T)
#> # A tibble: 2 × 3
#> variable avg sd
#> <chr> <dbl> <dbl>
#> 1 mpg 20.1 6.03
#> 2 disp 231. 124.
似乎是一种过于复杂的做法 select
->pivot
->group
->summarise
.
mtcars %>%
select(all_of(vars_to_transform)) %>%
pivot_longer(everything()) %>%
group_by(name) %>%
summarise(
mean = mean(value),
sd = sd(value)
)
# A tibble: 2 x 3
name mean sd
<chr> <dbl> <dbl>
1 disp 231. 124.
2 mpg 20.1 6.03
另一个选项:
library(purrr)
library(dplyr)
vars_to_transform <- c("mpg", "disp")
funs <- lst(mean, sd)
mtcars %>%
select(all_of(vars_to_transform)) %>%
map_df(~ funs %>%
map(exec, .x), .id = "var")
# A tibble: 2 x 3
var mean sd
<chr> <dbl> <dbl>
1 mpg 20.1 6.03
2 disp 231. 124.
m <- mtcars[, vars_to_transform]
tibble(variable = names(m), avg = apply(m, 2, mean), sd = apply(m, 2, sd))
## A tibble: 2 × 3
# variable avg sd
# <chr> <dbl> <dbl>
#1 mpg 20.1 6.03
#2 disp 231. 124.
给定数据框中数值变量名称的向量,我需要计算每个变量的均值和标准偏差。例如,给定 mtcars
数据集和以下变量名称向量:
vars_to_transform <- c("mpg", "disp")
我想要以下结果:
我想到的第一个解决方案如下:
library(dplyr)
library(purrr)
data("mtcars")
vars_to_transform <- c("mpg", "disp")
vars_to_transform %>%
map_dfr( function(x) { c(variable = x, avg = mean(mtcars[[x]], na.rm = T), sd = sd(mtcars[[x]], na.rm = T)) } )
结果如下:
如您所见,所有返回的变量都是字符,但我希望 avg
和 sd
有数字。
有办法解决这个问题吗?或者还有比这更好的解决方案吗?
P.S。
我正在使用 purr
0.3.4
以下工作(而不是在代码中使用 c()
,使用 tibble
):
vars_to_transform %>%
map_dfr(~ tibble(variable = .x, avg = mean(mtcars[[.x]], na.rm = T),
sd = sd(mtcars[[.x]], na.rm = T)))
解释: 对于 c()
,您使用的是向量,其元素 必须 具有相同的类型(character
在你的例子中,因为 variable
是 character
)。使用 tibble
,每个元素可以有不同的类型。
@Gwang-Jin Kim 在我感谢的评论中建议,也可以使用 list
而不是 tibble
。
或尝试添加 type.convert
:
library(dplyr)
library(purrr)
data("mtcars")
vars_to_transform <- c("mpg", "disp")
vars_to_transform %>%
map_dfr( function(x) { c(variable = x, avg = mean(mtcars[[x]], na.rm = T), sd = sd(mtcars[[x]], na.rm = T)) } ) %>%
type.convert(as.is=T)
#> # A tibble: 2 × 3
#> variable avg sd
#> <chr> <dbl> <dbl>
#> 1 mpg 20.1 6.03
#> 2 disp 231. 124.
似乎是一种过于复杂的做法 select
->pivot
->group
->summarise
.
mtcars %>%
select(all_of(vars_to_transform)) %>%
pivot_longer(everything()) %>%
group_by(name) %>%
summarise(
mean = mean(value),
sd = sd(value)
)
# A tibble: 2 x 3
name mean sd
<chr> <dbl> <dbl>
1 disp 231. 124.
2 mpg 20.1 6.03
另一个选项:
library(purrr)
library(dplyr)
vars_to_transform <- c("mpg", "disp")
funs <- lst(mean, sd)
mtcars %>%
select(all_of(vars_to_transform)) %>%
map_df(~ funs %>%
map(exec, .x), .id = "var")
# A tibble: 2 x 3
var mean sd
<chr> <dbl> <dbl>
1 mpg 20.1 6.03
2 disp 231. 124.
m <- mtcars[, vars_to_transform]
tibble(variable = names(m), avg = apply(m, 2, mean), sd = apply(m, 2, sd))
## A tibble: 2 × 3
# variable avg sd
# <chr> <dbl> <dbl>
#1 mpg 20.1 6.03
#2 disp 231. 124.