【问题标题】:Check if column exists and if it does check something about it检查列是否存在以及是否确实检查了有关它的内容
【发布时间】:2019-04-23 01:14:10
【问题描述】:

您好,我想检查 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)

使用更多上下文进行编辑:对于此示例,原因是用户可能输入特定于站点的数据,因此没有 Site 列(即,他们有一个 data.frame,其中只有一个数据站点,因此他们从未将站点指定为列),或者他们可能正在使用一个 data.frame,其中包含列中指定的多个站点的数据。因此,如果没有站点列,可以安全地假设数据是针对一个站点的,并且它可以继续计算,但是如果有一个站点列,我必须检查它是否只有一个不同的值(例如,可能已被过滤在应用通过plyr::ddply 应用的功能之前在此列上。 还有很多其他情况,但是我想检查我对函数的输入数据是否符合预期的形式,如果输入是 data.frame 这通常意味着检查列名和有关该列的内容

【问题讨论】:

    标签: r validation if-statement


    【解决方案1】:

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

    【讨论】:

    • 嗯,我认为这很有趣,因为这不是我曾经考虑过的方法,但我认为这对我来说并不实用,因为我可能还有很多其他事情要检查和因此可能会变得非常混乱。因此,虽然我认为这一次对我没有帮助,但我认为它在未来总体上可能会有所帮助
    • @user2738526 当然,没问题。实际上,如果不了解您正在尝试做的事情的背景,就很难优化/改进/建议一种方法。这只是一次尝试。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-20
    • 2015-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多