Исправление ошибки функции: объект 'pairlist' не может быть приведен к типу 'double' - PullRequest
1 голос
/ 14 июля 2020

Я написал функцию для суммирования одной и той же переменной numeri c в трех наборах данных. Этот код работает вне функции, когда я заменяю x фактическим именем переменной.

k1 <- data.frame(variable_name = rnorm(100), year = sample(x = 1990:1995, size = 100, replace = TRUE))
k2 <- data.frame(variable_name = rnorm(100), year = sample(x = 1990:1995, size = 100, replace = TRUE))
k3 <- data.frame(variable_name = rnorm(100), year = sample(x = 1990:1995, size = 100, replace = TRUE))

numeric_var_summary <- function(x) {
  
  x <- enquo(x)

  k1_x <- k1 %>%
    select(year, !!x) %>%
    group_by(year) %>%
    summarize(min = min(!!x), Q1 = quantile(!!x, 0.25), median = median(!!x), 
              Q3 = quantile(!!x, 0.75), max = max(!!x), Qrange = quantile(!!x, 0.75) - quantile(!!x, 0.25), 
              mean = mean(!!x), sd = sd(x), n = n(), 
              missing = sum(is.na(!!x)))
  
  k2_x <- k2 %>%
    select(xear, !!x) %>%
    group_by(year) %>%
    summarize(min = min(!!x), Q1 = quantile(!!x, 0.25), median = median(!!x), 
              Q3 = quantile(!!x, 0.75), max = max(!!x), Qrange = quantile(!!x, 0.75) - quantile(!!x, 0.25), 
              mean = mean(!!x), sd = sd(!!x), n = n(), 
              missing = sum(is.na(!!x)))
  
  k3_x <- k3 %>%
    select(year, !!x) %>%
    group_by(year) %>%
    summarize(min = min(!!x), Q1 = quantile(x, 0.25), 
              median = median(!!x), Q3 = quantile(!!x, 0.75),
              max = max(!!x), Qrange = quantile(!!x, 0.75) - quantile(!!x, 0.25), 
              mean = mean(!!x), sd = sd(!!x), n = n(),
              missing = sum(is.na(!!x)))
  
  return(bind_rows(k1_x, k2_x, k3_x), n = Inf)
  
  
}

numeric_var_summary(x = variable_name)

Но я получаю эту ошибку, когда пытаюсь запустить функцию:

Error in is.data.frame(x) : 
  'pairlist' object cannot be coerced to type 'double' 

I Интересно, проблема ли в аккуратной оценке? Не уверен, правильно ли я сделал. Спасибо за помощь.

1 Ответ

1 голос
/ 14 июля 2020

Начиная с dplyr 1.0, есть два способа приблизиться к этому:

  • если вы хотите передать идентификатор столбца как простое выражение, как в вашем примере, используйте {{x}}
  • в качестве альтернативы вы можете передать его как вектор символов, а затем использовать .data[[x]]

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

Поскольку вы вычисляете одну и ту же сводку для всех трех фреймов данных, вашу функцию также можно сделать намного более краткой. Здесь я использую purrr::map_dfr, чтобы применить функцию, которая суммирует один из ваших кадров данных ко всем трем кадрам данных, а затем привязывает результат к строке:

library(dplyr)
library(purrr)

set.seed(3046)

k1 <- data.frame(variable_name = rnorm(100), year = sample(x = 1990:1995, size = 100, replace = TRUE))
k2 <- data.frame(variable_name = rnorm(100), year = sample(x = 1990:1995, size = 100, replace = TRUE))
k3 <- data.frame(variable_name = rnorm(100), year = sample(x = 1990:1995, size = 100, replace = TRUE))


numeric_var_summary <- function(k, col, na.rm = TRUE) {
  
  k_summary <- k %>%
    select(year, {{col}}) %>%
    group_by(year) %>%
    summarize(min = min({{col}}, na.rm = na.rm), 
              Q1 = quantile({{col}}, 0.25, na.rm = na.rm),
              median = median({{col}}, na.rm = na.rm), 
              Q3 = quantile({{col}}, 0.75, na.rm = na.rm), 
              max = max({{col}}, na.rm = na.rm), 
              Qrange = quantile({{col}}, 0.75, na.rm = na.rm) - quantile({{col}}, 0.25, na.rm = na.rm), 
              mean = mean({{col}}, na.rm = na.rm), 
              sd = sd({{col}}, na.rm = na.rm), 
              n = n(), 
              missing = sum(is.na({{col}})))
  
  return(k_summary)
  
}


# compute the individual summaries and combine the results
map_dfr(list(k1, k2, k3), numeric_var_summary, col = variable_name)

#> `summarise()` ungrouping output (override with `.groups` argument)
#> `summarise()` ungrouping output (override with `.groups` argument)
#> `summarise()` ungrouping output (override with `.groups` argument)
#> # A tibble: 18 x 11
#>     year    min     Q1  median    Q3   max Qrange    mean    sd     n missing
#>    <int>  <dbl>  <dbl>   <dbl> <dbl> <dbl>  <dbl>   <dbl> <dbl> <int>   <int>
#>  1  1990 -1.18  -1.06  -0.553  0.312 2.72   1.37  -0.0309 1.38      9       0
#>  2  1991 -2.73  -0.775 -0.245  0.163 0.849  0.938 -0.471  0.954    18       0
#>  3  1992 -1.01  -0.176  0.354  0.735 2.75   0.911  0.344  0.849    21       0
#>  4  1993 -0.681 -0.247 -0.0524 0.567 1.99   0.814  0.256  0.799    14       0
#>  5  1994 -1.84  -1.08  -0.157  0.287 1.80   1.37  -0.280  0.948    18       0
#>  6  1995 -1.20  -0.573 -0.261  0.720 1.97   1.29   0.0397 0.881    20       0
#>  7  1990 -1.76  -0.397  0.283  0.534 1.29   0.931  0.0240 0.870    22       0
#>  8  1991 -2.24  -0.496 -0.112  0.372 1.29   0.868 -0.137  1.01     11       0
#>  9  1992 -1.44  -0.241  0.711  1.17  2.51   1.41   0.449  1.16     12       0
#> 10  1993 -1.92  -0.858 -0.210  0.770 2.31   1.63  -0.0219 1.11     22       0
#> 11  1994 -1.41  -0.207  0.485  0.870 2.23   1.08   0.332  0.987    14       0
#> 12  1995 -2.86  -0.374  0.300  1.05  2.35   1.43   0.221  1.24     19       0
#> 13  1990 -1.49  -1.03  -0.206  0.113 0.851  1.14  -0.292  0.722    14       0
#> 14  1991 -1.67  -0.454  0.139  0.514 1.82   0.968  0.0963 0.956    19       0
#> 15  1992 -2.11  -1.02  -0.217  0.569 1.10   1.59  -0.344  0.986    16       0
#> 16  1993 -1.58  -0.935 -0.0794 0.625 1.26   1.56  -0.160  0.946    10       0
#> 17  1994 -1.93  -0.494 -0.307  0.294 1.60   0.788 -0.186  0.902    22       0
#> 18  1995 -1.49  -0.751  0.374  0.900 2.19   1.65   0.229  1.10     19       0


# verify that the simplified function returns identical results:

numeric_var_summary_manual <- function(x) {
  
  k1_x <- k1 %>%
    select(year, {{x}}) %>%
    group_by(year) %>%
    summarize(min = min({{x}}), Q1 = quantile({{x}}, 0.25), median = median({{x}}), 
              Q3 = quantile({{x}}, 0.75), max = max({{x}}), Qrange = quantile({{x}}, 0.75) - quantile({{x}}, 0.25), 
              mean = mean({{x}}), sd = sd({{x}}), n = n(), 
              missing = sum(is.na({{x}})))
  
  k2_x <- k2 %>%
    select(year, {{x}}) %>%
    group_by(year) %>%
    summarize(min = min({{x}}), Q1 = quantile({{x}}, 0.25), median = median({{x}}), 
              Q3 = quantile({{x}}, 0.75), max = max({{x}}), Qrange = quantile({{x}}, 0.75) - quantile({{x}}, 0.25), 
              mean = mean({{x}}), sd = sd({{x}}), n = n(), 
              missing = sum(is.na({{x}})))
  
  k3_x <- k3 %>%
    select(year, {{x}}) %>%
    group_by(year) %>%
    summarize(min = min({{x}}), Q1 = quantile({{x}}, 0.25), 
              median = median({{x}}), Q3 = quantile({{x}}, 0.75),
              max = max({{x}}), Qrange = quantile({{x}}, 0.75) - quantile({{x}}, 0.25), 
              mean = mean({{x}}), sd = sd({{x}}), n = n(),
              missing = sum(is.na({{x}})))
  
  return(bind_rows(k1_x, k2_x, k3_x))
  
  
}


identical(numeric_var_summary_manual(x = variable_name),
          map_dfr(list(k1, k2, k3), numeric_var_summary, col = variable_name))

#> `summarise()` ungrouping output (override with `.groups` argument)
#> `summarise()` ungrouping output (override with `.groups` argument)
#> `summarise()` ungrouping output (override with `.groups` argument)
#> `summarise()` ungrouping output (override with `.groups` argument)
#> `summarise()` ungrouping output (override with `.groups` argument)
#> `summarise()` ungrouping output (override with `.groups` argument)
#> [1] TRUE
...