【发布时间】:2019-04-26 16:18:58
【问题描述】:
当存在完全健康的值时,if 语句会返回“缺失值”错误。
我想编写一个简单的脚本来删除数据集中的行,如果其中一个条目包含某个标签。我在新列(包含MR)中分配了一个指示变量,然后使用for循环遍历行。如果指示符为 TRUE,则应删除该行。
到目前为止,指标分配正确,非常好。有趣的部分:在循环的 if 语句中,读取值似乎有问题,因为它返回 "Error in if (data$containsMR[i]) { : 需要 TRUE/FALSE 的缺失值”。
鉴于指标变量的正确(和完整)分配,这让我感到惊讶。更奇怪的是:删除了一些,但不是所有带有正面指示符的行(通过打印输出和 table(data$containsMR) 检查)。
现在真正奇怪的事情是:如果我再次运行相同的循环,它会删除其余的列(应该如此),但返回相同的错误。所以,理论上,我可以只运行循环两次,忽略错误并得到我想要的结果。这真的不是我正在做的事情的重点。
尝试的错误修正: - 将 for- 更改为 while 循环 - 将指标(和 if 语句)更改为整数 (0,1) - 在 RStudio 和 R 控制台中运行脚本 - 更改变量名称、包含/排除定义(例如,添加代理变量 row_number 而不是在一行中调用它。
# Script to delete all rows containing "MR" in column "EXAM_CODE"
# import file
data <- read.csv("C:\\ScriptingTest\\ablations 0114.csv")
# add indicator column
for (i in 1:nrow(data)){
data$containsMR[i] <- ifelse(grepl("MR", toString(data$EXAM_CODE[i])), TRUE, FALSE)
}
# remove rows with positive indicator
row_number <- nrow(data)
for (i in 1:row_number){
if (data$containsMR[i]){
data <- data[-c(i),]
}
}
# export csv
write.csv(data, "C:\\ScriptingTest\\export.csv")
【问题讨论】:
-
想一想:您在循环期间更改了
data中的行数,但循环的长度是固定的。当data有 100 行,但你的 for 循环仍需要达到 105 行时会发生什么? -
另外,您可以在一行中执行此操作,例如
data[data$containsMR > 0,]. -
... 或者我猜是
data[!data$containsMR,],因为这实际上是布尔值。 -
删除和索引不是问题(据我所知);删除第 3 行将导致行为 1;2;4;[...]
-
这绝对是个问题。您最终将索引一个不再存在的行,因为您已经超出了数据框的末尾。
标签: r if-statement