dplyr не оценивает имя столбца с учетом заданной функции - PullRequest
0 голосов
/ 05 мая 2019

Dplyr внутри специализированной функции не оценивает столбец.

Я потратил часы, чтобы выяснить проблему в коде. У меня есть dataframe (пример ниже), который имеет несколько столбцов и создал функцию ниже для передачи dataframe и столбца. Цель состоит в том, чтобы сделать фильтрацию и мутировать, чтобы сделать линейную интерполяцию. Однако функция не читает столбец аргумента.

library(tidyverse)
library(imputeTS)
library(zoo)

dfm <- tbl_df(data.frame(country=rep('BGD', each=48), year=c(1970:2017), 
       STUNT=c(NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,                                                                 
       70.9,    NA, NA, NA, 63.4,   73.6,   71.5,   69.2,   67.3,    
       65.8,    63.8,   59.7, 59.3, 59.9,   50.8,   53.2,   51.4,   47.8,    
       50.5,    45.9,   45.1,   43.2,NA,    NA, NA, 41.4,   42,  
        38.7,   36.1,   NA, NA, NA, NA)))


vari = "STUNT"


data_impute<-        function(data, vari) {

                 data %>% 
                 select(country, year, paste0(vari)) %>%
                 group_by(country) %>% 
                 filter(seq_along(vari) >= min(which(!is.na(vari))) &
                        seq_along(vari) <= max(which(!is.na(vari)))) %>%
                mutate(vari= na.interpolation(vari, option="linear")) %>%
                select(country, year, paste0(vari)) %>%
                 ungroup()
               }

при выполнении функции с данными вместо нее выдается столбец STUNT со строкой «STUNT». Я вижу, что операция dplyr внутри не оценивает столбец от group_by до конца. Я прочитал много других подобных постов, но ни один не помог. Буду признателен, если вы сможете дать совет, в чем проблема.

1 Ответ

1 голос
/ 05 мая 2019

https://tidyeval.tidyverse.org/sec-why-how.html

dplyr использует форму «нестандартной оценки», которая во многих случаях очень удобна, но требует больше работы, когда вы хотите использовать ее для программирования. Я думаю, что приведенный ниже код работает, за исключением функции na.interpolation из другого пакета, предположительно. Подход, который я выбрал, заключался в том, чтобы «процитировать» переменную вверх, а затем использовать !! Оператор ("bang bang") для кавычек, где это необходимо.

data_impute<-        function(data, vari) {
  vari_quo <- enquo(vari)
  data %>% 
    select(country, year, paste0(!!vari_quo)) %>%
    group_by(country) %>% 
    filter(seq_along(!!vari_quo) >= min(which(!is.na(!!vari_quo))) &
             seq_along(!!vari_quo) <= max(which(!is.na(!!vari_quo)))) %>%
    # skipped next line b/c I don't have na.interpolation function
    # mutate(!!vari_quo := na.interpolation(!!vari_quo, option="linear")) %>%
    select(country, year, paste0(!!vari_quo)) %>%
    ungroup()
}

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