检查列是否存在,并且是否检查它

时间:2019-04-23 01:14:10

标签: r validation if-statement

嗨,我想检查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 :(得分:0)

您可以确定这是否是一种更聪明的方法,但是一种方法是使用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]],...)中的错误:函数必须具有特定于站点的数据