Переменная не найдена в функции, использующей функции dplyr - PullRequest
0 голосов
/ 07 мая 2018

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

Вот небольшая часть моего фрейма данных с множеством количественных переменных, вызывающих tabl_profil1:

  DateDiag   Age AgeDiag
     <dbl> <dbl>   <dbl>
1    1996.   43.     21.
2    2001.   53.     36.
3    2005.   75.     62.
4    1998.   62.     42.
5    2016.   53.     51.
6    2008.   65.     55.

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

Я пробовал по-разному, но всегда сталкивался с проблемами.

function1 <- function(VarName){results <<- tabl_profil1 %>% summarise(Mean = mean(VarName))}
function1(Age)

Ошибки:

Error in summarise_impl(.data, dots) : 
  Evaluation error: object 'Age' not found. 

Я также пытался использовать tabl_profil1 [[VarName]] в функции, но она не работает.

Надеюсь, вы поможете мне и спасибо заранее, Pierre

1 Ответ

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

Это нестандартная оценка . Если вы хотите использовать пустые имена столбцов, как это обычно делается в dplyr функциях, вам нужно использовать enquo для создания предложения. Затем, когда вы вызываете эту переменную, вам нужно !! перед ее именем. Попробуйте это:

function1 <- function(VarName){
    var <- enquo(VarName)
    results <<- tabl_profil1 %>% summarise(Mean = mean(!!var))
    }
function1(Age)

В ответ на обсуждение в комментариях: использование <<- внутри такой функции не является хорошей идеей по нескольким причинам. Во-первых, это означает, что вы определяете функцию, которая действует только на конкретный фрейм данных, в данном случае tabl_profil1, и возвращает результаты только определенной переменной, в данном случае, присваивая обратно results. Это в значительной степени противоречит цели написания функции, которая заключается в гибком повторении операции.

<<- использовать этот способ также не так уж безопасно, так как в итоге вы получите значение, хранящееся в results, которое может не знать точно, откуда оно взято. Лучше иметь возможность сказать, что вы вызвали функцию и вернули вывод определенной переменной, и вы можете видеть в своем коде, где именно вы это сделали.

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

Лучший способ структурировать эту функцию:

function1 <- function(df, VarName){
  var <- enquo(VarName)
  df %>% summarise(Mean = mean(!!var))
}

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

mean_age <- function1(tabl_profil1, Age)
mean_height_from_other_tbl <- function1(other_table, Height)

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

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