Проверьте, существует ли столбец и проверяет ли он что-либо об этом - PullRequest
1 голос
/ 23 апреля 2019

Привет! Я хочу проверить, существует ли столбец в data.frame, и только если он проверяет другие условия.

Я знаю, что могу использовать вложенный оператор if, как в примере.

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

testfun <- function(dat,...){
  library(dplyr)
  if("Site" %in% colnames(dat)){
    #for example check number of sites, this condition could be anything though
    if(n_distinct(dat$Site) >  1) stop ("Function must have site specific data")
  }
  #do stuff

  return(1)
}



testdf1 <- data.frame(x = 1:10, y = 1:10)
testdf2 <- data.frame(x = 1:10, y = 1:10,Site = "A")
testdf3 <- data.frame(x = 1:10, y = 1:10,Site = rep(c("A","B"),each = 5))


testfun(testdf1)
testfun(testdf2)
testfun(testdf3)

Редактирование с немного большим контекстом: в этом примере причина этого в том, что пользователь может вводить данные, которые являются специфическими для сайта и поэтому не имеют столбца сайта (т.е. у них есть data.frame с данными только в одном сайт, поэтому они никогда не указывали сайт в виде столбца) или они могли использовать data.frame, в котором были данные о количестве сайтов, указанных в столбце. Поэтому, если столбец «Сайт» отсутствует, можно с уверенностью предположить, что данные относятся к одному сайту, и он действителен для продолжения вычислений, но если столбец сайта существует, я должен проверить, что он имеет только одно отдельное значение (например, возможно, был отфильтрован). в этом столбце перед применением функции применяется через plyr::ddply). Однако во многих других случаях я хочу проверить, что мои входные данные для функции имеют ожидаемую форму, и если входные данные представляют собой data.frame, это часто означает проверку имен столбцов и что-то в этом столбце

1 Ответ

0 голосов
/ 23 апреля 2019

Вы можете решить, является ли это более разумным способом или нет, но одним из способов является разделение логики с помощью map_if.Здесь мы проверяем основное условие ("Site" %in% colnames(dat)) в предикатной части и на основании этого мы вызываем две функции: одну для TRUE и другую для FALSE.Мы по-прежнему проверяем аналогичные условия, но сохраняя отдельные функции, мы можем сохранить код в чистоте, и легко понять, какая часть делает что.

library(dplyr)
library(purrr)

testfun <- function(dat, ...) {
   unlist(map_if(list(dat), "Site" %in% colnames(dat), true_fun, .else = false_fun))
}

true_fun <- function(dat) {
    if(n_distinct(dat$Site) >  1) stop ("Function must have site specific data")
    return(1)
}

false_fun <- function(dat) { return(1) }


testfun(testdf1)
#[1] 1

testfun(testdf2)
#[1] 1

testfun(testdf3)

Ошибка в .f (.x [[i]], ...): функция должна содержать данные, специфичные для сайта

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