首页 > 解决方案 > 如何基于具有应用或 purrr 函数的自定义函数获取具有多行的数据框?

问题描述

我想得到一个带有变量名、均值和标准差的数据框。为此,我创建了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))

标签: rlapplypurrr

解决方案


map我们可以在将函数从{{}}to更改为ensym并评估后遍历名称!!

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

推荐阅读