如何根据带有 apply 或 purrr 函数的自定义函数获取包含多行的数据框?

How to get a dataframe with multiple rows based on custom function with apply or purrr functions?

我想要一个包含变量名、均值和标准差的数据框。为此,我创建了 descriptives 函数:

library(tidyverse)
library(labelled)
data <- read_spss("http://staff.bath.ac.uk/pssiw/stats2/SAQ.sav")
descriptives <- function(data, var) {
  
  data %>% 
    select({{var}}) %>% 
    drop_na() %>% 
    summarize(Label = labelled::var_label({{var}}), Mean = mean({{var}}), `Std Dev` = sd({{var}}))
}
descriptives(data, Q01)

我试图将此函数映射到所有变量 Q01:Q23 但我收到此错误:Error in is_quosure(x) : argument "x" is missing, with no default

data %>% 
  select(Q01:Q23) %>% 
  map_dfr(descriptives(data))

我们可以在将函数从 {{}} 更改为 ensym 后循环遍历 map 中的名称,并使用 !!

进行评估
library(dplyr)
library(purrr)
library(haven)
library(labelled)
map_dfr(names(data), ~ descriptives(data, !!.x))

-输出

# A tibble: 23 x 3
   Label                                                                  Mean `Std Dev`
   <chr>                                                                 <dbl>     <dbl>
 1 Statiscs makes me cry                                                  2.37     0.828
 2 My friends will think I'm stupid for not being able to cope with SPSS  1.62     0.851
 3 Standard deviations excite me                                          2.59     1.08 
 4 I dream that Pearson is attacking me with correlation coefficients     2.79     0.949
 5 I don't understand statistics                                          2.72     0.965
 6 I have little experience of computers                                  2.23     1.12 
 7 All computers hate me                                                  2.92     1.10 
 8 I have never been good at mathematics                                  2.24     0.873
 9 My friends are better at statistics than me                            2.85     1.26 
10 Computers are useful only for playing games                            2.28     0.877
# … with 13 more rows

-使用的函数

descriptives <- function(data, var) {
  
  var <- rlang::ensym(var)
  data %>% 
    select(!! var) %>% 
    drop_na() %>% 
    summarize(Label = labelled::var_label(!!var),
         Mean = mean(!!var), `Std Dev` = sd(!!var))
}