首页 > 解决方案 > 用户定义的函数检查显示不正确输出的数据框中是否存在两个列名

问题描述

我正在创建一个用户定义的函数,用于检查用户提供给函数的两个列名是否存在于给定的数据框中。该函数有三个结果:(1)两个列名都不存在于数据框中;(2)数据框中不存在var1,但是var2存在;(3) var2 在数据框中不存在,但 var1 存在。

功能如下:

vars_check <- function(df, var1, var2) {
  
  if (!all(c(var1, var2) %in% names(df))) {
    stop(paste("Both", var1, "and", var2, 
                "cannot be found in the dataset"))
  }
  
  if (!var1 %in% names(df)) {
    stop(paste(var1, "cannot be found in the dataset"))
  } 
  
  if (!var2 %in% names(df)) {
    stop(paste(var2, "cannot be found in the dataset"))
  }
}

以 iris 数据集为例,当数据框中不存在 var1 但 var2 存在时,我得到以下错误输出:

vars_check(iris, "dslmfbndsfb", "Species")
Error in vars_check(iris, "dslmfbndsfb", "Species") : 
  Both dslmfbndsfb and Species cannot be found in the dataset

问题是数据框中存在“物种”,该函数应该为我提供结果 2(var1 不存在;var2 存在)而不是结果 1(两者都不存在)。当我为 var2 输入一个不存在的列并为 var1 输入一个现有列时,会显示不正确的输出。

我试图修改我的代码,使初始代码if后面跟着两个else if,但是以某种方式,我得到了其中一个排列的不正确输出。

我的功能基于此线程中的想法。

谢谢!

标签: rdataframeuser-defined-functions

解决方案


all(c(var1, var2) %in% names(df))FALSE如果其中一个var1或缺失,则已经是,如果只有一个变量缺失,则该条件是var2否定的。您可以明确检查:!TRUE

vars_check <- function(df, var1, var2) {
  
  if (!var1 %in% names(df) && !var2 %in% names(df)) {
    stop(paste("Both", var1, "and", var2, 
               "cannot be found in the dataset"))
  }
  
  if (!var1 %in% names(df)) {
    stop(paste(var1, "cannot be found in the dataset"))
  } 
  
  if (!var2 %in% names(df)) {
    stop(paste(var2, "cannot be found in the dataset"))
  }
}

或者,您可以使用any

vars_check <- function(df, var1, var2) {
  
  if (!any(c(var1, var2) %in% names(df))) {
    stop(paste("Both", var1, "and", var2, 
               "cannot be found in the dataset"))
  }
  
  if (!var1 %in% names(df)) {
    stop(paste(var1, "cannot be found in the dataset"))
  } 
  
  if (!var2 %in% names(df)) {
    stop(paste(var2, "cannot be found in the dataset"))
  }
}

我认为这里正确的关键词是德摩根定律:https ://en.wikipedia.org/wiki/De_Morgan%27s_laws


推荐阅读