如何检查数据集中是否存在一列或多列

How to check if one or more columns exist in dataset

提问人:Salvador 提问时间:11/5/2023 最后编辑:jay.sfSalvador 更新时间:11/5/2023 访问量:36

问:

如何检查我的数据集是否包含执行计算所需的所有列?我可以成功检查一列,但是当我添加另一列进行检查时,我收到一条消息,说只会评估第一列。实现这一目标的最有效方法是什么?我得到了这个代码并在下面尝试:

   wk month         xd         td        pd year
1   1     1 0.03700988 0.02701157  317.3084 2007
2   1     1 0.03912160 0.02841586    0.0000 2007
3   1     1 0.04098652 0.02965604  126.7196 2007
4   1     1         NA         NA        NA 2007
5   1     1         NA         NA        NA 2007
6   1     1         NA         NA        NA 2007
7   1     1         NA         NA        NA 2007
8   2     1 0.01518800 0.01250000 2671.6000 2007
9   2     1 0.00751300 0.00739600 3540.6977 2007
10  2     1 0.01271600 0.01085600 1270.3574 2007
11  2     1 0.01396200 0.01168500 1067.6936 2007
12  2     1 0.01425900 0.01188200  688.0996 2007
13  2     1 0.02355300 0.01806300  317.4445 2007
14  2     1 0.03212200 0.02376100  420.9419 2007
15  3     1 0.03953000 0.02868700  280.4755 2007
16  3     1 0.02894600 0.02164900  250.6813 2007
17  3     1 0.03076900 0.02286100  159.0482 2007
18  3     1 0.03081500 0.02289200  258.1251 2007
19  3     1 0.02918700 0.02180900  450.8689 2007
20  3     1 0.02260400 0.01743200    0.0000 2007
21  3     1 0.02892000 0.02163200  120.8395 2007

#Data
a <- structure(list(wk = c(1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 
2, 3, 3, 3, 3, 3, 3, 3), month = c(1, 1, 1, 1, 1, 1, 1, 1, 1, 
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1), xd = c(0.0370098838217444, 
0.0391215970961887, 0.0409865246890313, NA, NA, NA, NA, 0.015188, 
0.007513, 0.012716, 0.013962, 0.014259, 0.023553, 0.032122, 0.03953, 
0.028946, 0.030769, 0.030815, 0.029187, 0.022604, 0.02892), td = c(0.02701157274146, 
0.0284158620689655, 0.0296560389182058, NA, NA, NA, NA, 0.0125, 
0.007396, 0.010856, 0.011685, 0.011882, 0.018063, 0.023761, 0.028687, 
0.021649, 0.022861, 0.022892, 0.021809, 0.017432, 0.021632), 
    pd = c(317.308439683869, 0, 126.719553152898, NA, NA, NA, 
    NA, 2671.6, 3540.6976744186, 1270.35740604274, 1067.69362430466, 
    688.099646524154, 317.444499806234, 420.941879550524, 280.475476696762, 
    250.681324772507, 159.048160622895, 258.125109208457, 450.868907331836, 
    0, 120.83949704142), year = c(2007, 2007, 2007, 2007, 2007, 
    2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 
    2007, 2007, 2007, 2007, 2007, 2007)), class = "data.frame", row.names = c(NA, 
-21L))
a

#Delete first two columns to test
a <- a[,c(3:6)]
names(a)

missing <- c("wk","month")
if (missing %in% colnames(a)) {
  #print("column Exists")
} else {
  stop("columns are missing") #I want R to stop executing any code below
}

#More code.....
r if 语句

评论

1赞 Jon Spring 11/5/2023
any(!missing %in% colnames(a))如果缺少任何指定的列,则为 TRUE。在这种情况下,缺少 IN 中的两列。missing
0赞 Salvador 11/5/2023
通过您的代码,我了解到即使列不存在,它们也存在@JonSpring
1赞 Jon Spring 11/5/2023
我认为这是您想要的,但是由于您为需要存在的列命名,结果令人困惑。我正在测试中是否有任何列不存在,也不存在,因此我们得到 TRUE 和 TRUE。 测试是否有任何参数为真,在本例中,由于缺少两列,因此两者都为真。missingmissingany()
0赞 Salvador 11/5/2023
明白了。我又重新运行了。不过,我注意到的一件事是,它不会停止脚本,即使缺少列的条件为真,它也会继续执行。这是 stop 的正常行为,还是有其他方法可以停止 stop 下面的代码执行?stop'stop

答:

1赞 jay.sf 11/5/2023 #1

在为对象使用名称之前,应首先检查是否存在具有此名称的函数。这里是一个可用于未指定参数的函数,因此读取当前代码非常令人困惑。您只需在控制台中键入名称(不带括号)。missing()

> missing
function (x)  .Primitive("missing")

显然它是一个函数,否则我们会得到 ,所以使用不同的东西。现在来回答你的问题。Error: object 'missing' not found

在 - 块中,首先评估是否存在特定条件,然后在块中解决一般情况。ifelseifelse

括号内的输出长度应为 1。对于多个条件,可以使用诸如 or 之类的函数将条件聚合到单个逻辑值中。if()all()any()

由于您已将“如果我的数据集包含所有必需的列”(我的强调)指定为一般方案,因此由(不是全部)表示的反之则是您要检查的特定条件。if (!all(...))

need <- c("wk", "month")
if (!all(need %in% colnames(a))) {
  stop("columns are missing") 
} else {
  message("column Exists")
  ## do stuff
}

评论

0赞 Salvador 11/5/2023
感谢您的澄清 @jay.sf 。我注意到的一件事是条件为 TRUE,并且数据帧中缺少列,代码在 之后继续运行。我把以下内容放在最后一个大括号下面:stopprint("I didn't stop"); b <- 3+3; b