Ошибка в grouped_df_impl (data, unname (vars), drop): столбец неизвестен - PullRequest
0 голосов
/ 31 мая 2018

У меня есть фрейм данных, который выглядит следующим образом

df <- data.frame (
  age = rep(c("40-44", "45-49", "50-54", "55-59", "60-64"),4),
  dep = rep(c("Dep1", "Dep2", "Dep3", "Dep4", "Dep5"),4),
  ethnic = rep(c(rep("M",5),rep("NM",5)),2),
  gender = c(rep("M",10), rep("F",10))
)

Я пытаюсь сгенерировать описательную статистику для ряда схожих фреймов данных, все из которых получены из разных источников, поэтому я могу сравнить.

Я использую следующий код, чтобы получить счетчик и пропорцию для пола, пола, этнической принадлежности, возраста и пола + этнической принадлежности в качестве функции, которую я могу применить к нескольким наборам данных

Dems_fun <- function(data, sex, eth, dep, age) {

  Fun <- function(data, ...) {
    group_var <- quos(...)

    data %>% 
      group_by(!!! group_var) %>%
      summarise (n = n()) %>%
      mutate(freq = n / sum(n)) %>%
      unite(dem, !!! group_var, sep = "_", remove = T)
  }

  Sex <- Fun(data, sex)
  Sex_eth <- Fun(data, sex, eth) 
  Eth <- Fun(data, eth)
  Dep <- Fun(data, dep)
  Age <- Fun(data, age)

  Dems <- rbind(Sex, Sex_eth, Eth, Dep, Age)
  colnames(Dems) <- c("Category", "count", "percentage")
  return(Dems)
}

Когда язапустить эту функцию

test <- Dems_fun(df, gender, ethnic, dep, age)

Я получаю следующее сообщение об ошибке:

Ошибка в grouped_df_impl (данные, unname (переменные), отбрасывание): столбец sex неизвестен

Может кто-нибудь сказать мне, где я иду не так?

Я видел этот похожий вопрос Ошибка при использовании enquo для создания функции с ddplyr , но я не могу 'не могу сказать, относятся ли те же ошибки к моему примеру.

1 Ответ

0 голосов
/ 31 мая 2018

Единственное, что вам не хватает - вам нужно enquo имена столбцов функции, а затем заключить их в кавычки (!!), когда вы будете использовать их в качестве аргументов функции позже.Таким образом, вы наберете age_var <- enquo(age) и затем вернетесь к этому с помощью !!age_var при вызове Fun.

library(tidyverse)

df <- data.frame (
  age = rep(c("40-44", "45-49", "50-54", "55-59", "60-64"),4),
  dep = rep(c("Dep1", "Dep2", "Dep3", "Dep4", "Dep5"),4),
  ethnic = rep(c(rep("M",5),rep("NM",5)),2),
  gender = c(rep("M",10), rep("F",10))
)

Dems_fun <- function(data, sex, eth, dep, age) {
  # enquo all these variables
  sex_var <- enquo(sex)
  eth_var <- enquo(eth)
  dep_var <- enquo(dep)
  age_var <- enquo(age)

  Fun <- function(data, ...) {
    group_var <- quos(...)

    data %>% 
      group_by(!!! group_var) %>%
      summarise (n = n()) %>%
      mutate(freq = n / sum(n)) %>%
      unite(dem, !!! group_var, sep = "_", remove = T)
  }

  # unquote all these variables
  Sex <- Fun(data, !!sex_var)
  Sex_eth <- Fun(data, !!sex_var, !!eth_var) 
  Eth <- Fun(data, !!eth_var)
  Dep <- Fun(data, !!dep_var)
  Age <- Fun(data, !!age_var)

  Dems <- rbind(Sex, Sex_eth, Eth, Dep, Age)
  colnames(Dems) <- c("Category", "count", "percentage")
  return(Dems)
}

Dems_fun(df, gender, ethnic, dep, age)
#> # A tibble: 18 x 3
#>    Category count percentage
#>    <chr>    <int>      <dbl>
#>  1 F           10        0.5
#>  2 M           10        0.5
#>  3 F_M          5        0.5
#>  4 F_NM         5        0.5
#>  5 M_M          5        0.5
#>  6 M_NM         5        0.5
#>  7 M           10        0.5
#>  8 NM          10        0.5
#>  9 Dep1         4        0.2
#> 10 Dep2         4        0.2
#> 11 Dep3         4        0.2
#> 12 Dep4         4        0.2
#> 13 Dep5         4        0.2
#> 14 40-44        4        0.2
#> 15 45-49        4        0.2
#> 16 50-54        4        0.2
#> 17 55-59        4        0.2
#> 18 60-64        4        0.2

Создано в 2018-05-30 с помощью пакета Представить (v0.2.0).

...