Почему я получаю ошибку с фильтром?Ошибка в filter_impl (.data, quo): Ошибка оценки: объект не найден - PullRequest
0 голосов
/ 06 марта 2019

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

Вот мой фрейм данных выглядит так:

head(SoilGeology, n=5)  
# A tibble: 5 x 12
  Year  Zone            SubZone         Au_ppm Ag_ppm Cu_ppm Pb_ppm Zn_ppm As_ppm Sb_ppm Bi_ppm Mo_ppm
  <chr> <chr>           <chr>            <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>
1 1990  BugLake         BugLake          0.007    3.7     17     27     23      1      1     NA      1
2 1983  Johnny Mountain Johnny Mountain  0.01     1.6     71     63    550      4     NA     NA     NA
3 1983  Khyber Pass     Khyber Pass      0.12    11.5    275    204   8230    178      7     60     NA
4 1987  Chebry          Ridge Line Grid  0.05     2.2     35     21    105     16      6     NA     NA
5 1987  Chebry          Handel Grid      0.004    1.3     29     27    663     45      2     NA     NA

Функция, которую я написал, выглядит следующим образом:

library(dplyr)
my_function <- function(df, st, elt){  

# df = data frame, str = element in string form, elt = element

  # tests
  if(!is.data.frame(df)){
    print("The table is not a data frame.")
    return(NULL)}  

  if(!is.character(st)){
     print('st is not in string form.')
     return(NULL)}

  if(!(st %in% colnames(df))){ 
    print("The element is not in the data frame.")
    return(NULL)}

  x <- list() # create our output list

  # Summary statistics
  x$stat <- df %>%
    filter(!is.na(elt)) %>%
    group_by(Year, Zone, SubZone) %>%
    summarise(
      n = sum(!is.na(elt)),
      min = min(elt),
      max = max(elt),
      mean = mean(elt),
      sd = sd(elt))

  # Boxplot
  x$boxplot <- df %>%
    group_by(Year, Zone, SubZone) %>%
    filter(n() > 40 & !is.na(elt)) %>%
    ggplot(df, mapping = aes(Zone, elt, color = Year)) +
    geom_boxplot() +
    scale_y_log10() +
    coord_flip()

  return(x)
}

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

Ag <- summary_statistics(SoilGeology,'Ag_ppm', Ag_ppm)
Error in filter_impl(.data, quo) : 
  Evaluation error: object 'Ag_ppm' not found.

За пределами функции мой код работает нормально.

Есть идеи, почему моя функция не работает?

1 Ответ

0 голосов
/ 08 марта 2019

Проблема может быть из-за нестандартной оценки (NSE) в dplyr.

Вы можете посмотреть по этой ссылке, очень очень поучительно: Программирование с помощью dplyr .

Краткий ответ для вашей ситуации (это должно сработать):

  • в вашей функции, преобразуйте входные данные в «quosure»: вставьте в начало вашей функции: elt <- enquo(elt)
  • in x$stats и x$boxplot, "аккуратно оценить" ввод, заменив elt на !! elt

Вы также можете посмотреть по этой ссылке , в которой есть полезные идеи.

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