Состояние в самодельной функции - PullRequest
1 голос
/ 12 апреля 2020

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

na_check = function(table, attribute, condition){

  # Definining a potential list of NA
  na_list = c(NA, '', 'NA', 'NULL', '-', '<NA>', '.', 'N/A', 'n/a', '#N/A', 'null', 'na', '<na>', '#n/a', '-')
table = subset(table, condition)
      na_test = table[[attribute]] %in% na_list}

Проблема в том, как определить условие (я бы хотел, чтобы пользователь мог указать его, как в функции 'subset'). Например,

na_check(dt, id, country == 'US')

и таблица должна быть сначала подмножеством как

table = subset(get(table), country == 'US')

, а не как

na_check(dt, id, "country == 'US'")

, где я должен был бы сделать сначала:

table = subset(table, eval(parse(text == condition)))

Моя цель - сделать его удобным для пользователя

1 Ответ

1 голос
/ 12 апреля 2020

С помощью Tidyverse мы можем использовать {{}} для оценки

library(dplyr)
na_check <- function(dat, attribute, condition) {
   na_list <- c(NA, '', 'NA', 'NULL', '-', '<NA>', '.', 'N/A', 'n/a', 
              '#N/A', 'null', 'na', '<na>', '#n/a', '-')

    dat %>% 
            filter({{condition}}) %>%
             filter({{attribute}} %in% na_list) 
}


data(iris) 
iris$Sepal.Length[c(5,  25,  35)] <- c('NULL', 'N/A', 'n/a')
na_check(iris, attribute =  Sepal.Length, condition = Species == 'setosa')
#  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
#1         NULL         3.6          1.4         0.2  setosa
#2          N/A         3.4          1.9         0.2  setosa
#3          n/a         3.1          1.5         0.2  setosa
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...