Переменные для суммирования данных в статистике dplyr и R: Обратитесь к именам столбцов, которые хранятся в виде строк с местоимением `.data`: - PullRequest
2 голосов
/ 03 октября 2019

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

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

Я использовал пример в https://dplyr.tidyverse.org/reference/summarise.html, но это не работает и генерирует

Ошибка: невозможно преобразовать NULL в квозер

, если я использую: с использованием имен столбцов переменных в dplyr summaze

Я получаю Ошибка в sort.int (x, na.last = na.last, уменьшается = уменьшается, ...): «x» должен быть атомарным

, если я использую R - dplyr 0.4.1: Как суммировать по имени столбца в функции

Я получаю ошибку Ошибка в! Rlang :: sym (column_to_summerise): недопустимый тип аргумента

У меня есть фрейм данных этой структуры и примеры данных.

Date_Received Discipline Specimen_Number Specimen_Details_Booked_By Date_Time_Booked_In Date_Booked_In
1    2019-09-04          C  B,19.4015575.P                       CMSE 2019-09-04 01:03:00     2019-09-04

Date_Time_Authorised Date_Time_Collected  Date_Time_Received Set_Code Location Location_Group_Code
1  2019-09-04 01:31:00 2019-09-04 00:30:00 2019-09-04 00:55:00     PRO2     QOPD                <NA>

Analytical_Category tat_auth_collected tat_auth_recieved travel_time reception_time hour_booked_in
1                   E          1.0166667         0.6000000   0.4166667     0.13333333              1

и я нахожусьlding универсальную функцию:

summariseData <- function(df, column_to_summerise, target, kpi_target)
{
  calc_df <- df %>% 
    group_by(Date_Received) %>% 
    dplyr::summarise_(med=median(.data[[column_to_summerise]], na.rm = TRUE), 
                     per95=quantile(.data[[column_to_summerise]], probs = kpi_target, na.rm = TRUE), 
                     In_Target = sum(.data[[column_to_summerise]] <= target, na.rm = TRUE), 
                     Out_Target = sum(.data[[column_to_summerise]] > target, na.rm = TRUE), 
                     Total_Data = count(df)) 
  return(calc_df)
}

или используя:

summariseData <- function(df, column_to_summerise, target, kpi_target)
{
  calc_df <- df %>% 
    group_by(Date_Received) %>% 
    dplyr::summarise_(med=median(get(column_to_summerise), na.rm = TRUE), 
                     per95=quantile(get(column_to_summerise), probs = kpi_target, na.rm = TRUE), 
                     In_Target = sum(get(column_to_summerise) <= target, na.rm = TRUE), 
                     Out_Target = sum(get(column_to_summerise) > target, na.rm = TRUE), 
                     Total_Data = count(df)) 
  return(calc_df)
}

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

# In hours
turnaround_time_target <- 4

# in minutes
reception_target <- 15

# in minutes
travel_time_target <- 15

# In percent
kpi_trigger <- 98

#percentile for KPI
percentile_for_kpi <- kpi_trigger / 10

df_collection <- summariseData(original_df, "tat_auth_collected", turnaround_time_target, percentile_for_kpi)  

1 Ответ

0 голосов
/ 04 октября 2019

используя схему в комментариях Луиса. Переводя в мою функцию:

summariseData <- function(df, column_to_summerise, target, kpi_target)
{
  column_to_summerise <- enquo(column_to_summerise)

  calc_df <- df %>% 
    group_by(Date_Received) %>% 
    dplyr:: summarise(med=median(!!column_to_summerise, na.rm = TRUE), 
                      per95=quantile(!!column_to_summerise, probs = kpi_target, na.rm = TRUE), 
                      In_Target = sum(!!column_to_summerise <= target, na.rm = TRUE), 
                      Out_Target = sum(!!column_to_summerise > target, na.rm = TRUE), 
                      Total_Data = n()) 
  return(calc_df)
}

Ключевым моментом является использование функции enquo () перед использованием !!

С (https://dplyr.tidyverse.org/articles/programming.html) По аналогии со строками, мы не хотим "", вместо этого мы хотим, чтобы какая-то функция превращала аргумент в строку. Это работа enquo (). Enquo () использует некоторую темную магию, чтобы посмотреть на аргумент, см. что пользователь набрал, и вернуть это значение в виде выражения

В dplyr (и в tidyeval в целом) вы используете !!, чтобы сказать, что вы хотите снять кавычки для ввода, чтобы он оценивался

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