提问人:Salvador 提问时间:11/5/2023 最后编辑:jay.sfSalvador 更新时间:11/5/2023 访问量:36
如何检查数据集中是否存在一列或多列
How to check if one or more columns exist in dataset
问:
如何检查我的数据集是否包含执行计算所需的所有列?我可以成功检查一列,但是当我添加另一列进行检查时,我收到一条消息,说只会评估第一列。实现这一目标的最有效方法是什么?我得到了这个代码并在下面尝试:
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.....
答:
1赞
jay.sf
11/5/2023
#1
在为对象使用名称之前,应首先检查是否存在具有此名称的函数。这里是一个可用于未指定参数的函数,因此读取当前代码非常令人困惑。您只需在控制台中键入名称(不带括号)。missing()
> missing
function (x) .Primitive("missing")
显然它是一个函数,否则我们会得到 ,所以使用不同的东西。现在来回答你的问题。Error: object 'missing' not found
在 - 块中,首先评估是否存在特定条件,然后在块中解决一般情况。if
else
if
else
括号内的输出长度应为 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,并且数据帧中缺少列,代码在 之后继续运行。我把以下内容放在最后一个大括号下面:stop
print("I didn't stop"); b <- 3+3; b
评论
any(!missing %in% colnames(a))
如果缺少任何指定的列,则为 TRUE。在这种情况下,缺少 IN 中的两列。missing
missing
missing
any()
stop
'stop