计算数据框中给定变量的均值和标准差

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)) } )

结果如下:

如您所见,所有返回的变量都是字符,但我希望 avgsd 有数字。

有办法解决这个问题吗?或者还有比这更好的解决方案吗?

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 在你的例子中,因为 variablecharacter)。使用 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.