Нужна помощь в написании функции для summary_table (dplyr :: group_by - PullRequest
0 голосов
/ 23 апреля 2020

Я пытаюсь создать функцию, которая сведет к минимуму количество раз, когда мне придется рассчитывать все характеристики по отдельности (Мин, Медиана, Макс, Среднее, SD и NA). Я включил первые две части этого большого списка, и как этот список используется.

  list("Child Age" =
       list("Min" = ~ min(.data$ChildAge,na_rm = TRUE),
            "Median" = ~ median(.data$ChildAge,na_rm = TRUE),
            "Mean ± SD" = ~ qwraps2::mean_sd(.data$ChildAge,na_rm = TRUE),
            "Max" = ~ max(.data$ChildAge,na_rm = TRUE),
            "NA (Not factored in analysis)" =  ~  percent(sum(is.na(.data$ChildAge)) /length(.data$ChildAge))),
      "Child Gender" =
       list("Girl" = ~ qwraps2::n_perc(.data$ChildGender == "Girl", na_rm = TRUE),
            "Boy" = ~ qwraps2::n_perc(.data$ChildGender == "Boy", na_rm = TRUE))
......
by_clinic_demographic <- summary_table(dplyr::group_by(df, Clinic), demographic_summary)
by_clinic_demographic

Я попытался разработать функцию, которая будет работать:

analysis_func <- function(x=df$StudyID) {
  list1 <- list("Min" =   min(x,na.rm = TRUE),
            "Median" =  median(x,na.rm = TRUE),
            "Mean &plusmn; SD" =  qwraps2::mean_sd(x,na_rm = TRUE),
            "Max" =  max(x,na.rm = TRUE),
          "NA (Not factored in analysis)" =   percent(sum(is.na(x)) /length(x)))
  #str(list1)
  return(list1)
}

Когда я тогда go вызову эту функцию в новом списке:

assessment_summary <-
  list("Mother Age" = analysis_func(.data$MotherAge),, 

Я получаю ошибку: Ошибка: x должна быть формулой

Когда я добавляю ~ после знака =, например:

"Min" = ~  min(x,na.rm = TRUE)

Затем я получаю ошибку: Ошибка в FUN (X [[i]], ...): определяется только для фрейма данных со всеми цифрами c переменных

Здесь упрощенная версия, чтобы подчеркнуть проблему, с которой я столкнулся:

analysis_func <- function(x=df$StudyID) {
  list1 <- list("Min" = ~ min(x,na.rm = TRUE),
            "Median" = ~ median(x,na.rm = TRUE),
            "Mean &plusmn; SD" = ~ qwraps2::mean_sd(x,na_rm = TRUE),
            "Max" = ~ max(x,na.rm = TRUE),
          "NA (Not factored in analysis)" =  ~ percent(sum(is.na(x)) /length(x)))
  return(list1)
}
test_summary <-
  list("Scores" = analysis_func(.data$StudyID))
# test_stack <- summary_table(dplyr::group_by(dataframe, s), test_summary)
# test_stack

n = c(2, 3, 5, 4,10,12,rep(10,4)) 
s = c(rep("aa",5),rep("bb",5)) 
dataframe <- data.frame (n,s)



test_summary2 <-
  list("Scores" =
       list("Min" = ~ min(.data$n,na_rm = TRUE),
            "Median" = ~ median(.data$n,na_rm = TRUE),
            "Mean &plusmn; SD" = ~ qwraps2::mean_sd(.data$n,na_rm = TRUE),
            "Max" = ~ max(.data$n,na_rm = TRUE),
            "NA (Not factored in analysis)" =  ~  percent(sum(is.na(.data$n)) /length(.data$n)))
  )

test_stack <- summary_table(dplyr::group_by(dataframe, s), test_summary2)
test_stack

Любая помощь будет принята.

1 Ответ

0 голосов
/ 23 апреля 2020

Мы можем использовать эту функцию:

analysis_func <- function(x) {
   list1 <- list(Min = min(x,na.rm = TRUE),
                 Median = median(x,na.rm = TRUE),
                 Mean = mean(x,na.rm = TRUE),
                 SD = sd(x, na.rm = TRUE),
                 Max = max(x,na.rm = TRUE),
                "NA (Not factored in analysis)" =  mean(is.na(x)))
    return(list(list1))
}

и затем вызывать ее по группам.

library(dplyr)
dataframe %>% group_by(s) %>% summarise(summary_list = analysis_func(n)) 


# A tibble: 3 x 2
#  s     summary_list    
#  <fct> <list>          
#1 aa    <named list [6]>
#2 bb    <named list [6]>
#3 cc    <named list [6]>

Если мы хотим выводить как отдельные столбцы, мы можем добавить unnest_wider

dataframe %>%
  group_by(s) %>%
  summarise(summary_list = analysis_func(n))  %>%
  tidyr::unnest_wider(summary_list)

# A tibble: 3 x 7
#   s       Min Median  Mean    SD   Max `NA (Not factored in analysis)`
#  <fct> <dbl>  <dbl> <dbl> <dbl> <dbl>                           <dbl>
#1 aa        2      3     3  1.41     4                               0
#2 bb        3      3     3 NA        3                               0
#3 cc        5      5     5 NA        5                               0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...