r-用户定义的函数,用于检查数据帧中是否存在显示错误输出的两个列名



我正在创建一个用户定义的函数,该函数检查用户提供给函数的两个列名是否存在于给定的数据帧中。函数有三个结果:(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,但无论如何,我得到了其中一个排列的错误输出。

我的函数基于这个线程中的思想。

谢谢!

如果var1var2缺失,则all(c(var1, var2) %in% names(df))已为FALSE,如果只有一个变量缺失,则使用否定!,则此条件为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

最新更新