我正在尝试消除excel中具有以下功能的所有行:
我写的代码似乎无限期地运行。 CAS.MULT是我的数据帧的名称。
for (i in 1:nrow(CAS.MULT)) {
testInteger <- function(x) {
test <- all.equal(x, as.integer(x), check.attributes = FALSE)
if (test == TRUE) {
return (TRUE)
}
else {
return (FALSE)
}
}
if (testInteger(as.integer(CAS.MULT[i,1])) == TRUE) {
if (testInteger(as.integer(substring(CAS.MULT[i,2],1,1))) == TRUE) {
if (CAS.MULT[i,3] == '') {
CAS.MULT <- data.frame(CAS.MULT[-i,])
}
}
}
}
答案 0 :(得分:0)
如果经常导致意外行为,您应该非常谨慎地删除for循环中的行。有很多方法可以解决这个问题。例如,您可以标记要删除的行,然后删除它们。
我注意到的另一件事是你将列转换为整数,然后将它们传递给函数以测试它们是否为整数,因此对于传递给函数的所有值,你将错误地返回true。
也许这样的事情会起作用(没有一个可重复的例子,很难说它是否会起作用):
toDelete <- numeric(0)
for (i in 1:nrow(CAS.MULT)) {
testInteger <- function(x) {
test <- all.equal(x, as.integer(x), check.attributes = FALSE)
if (test == TRUE) {
return (TRUE)
}
else {
return (FALSE)
}
}
if (testInteger(CAS.MULT[i,1]) == TRUE) {
if (testInteger(substring(CAS.MULT[i,2],1,1)) == TRUE) {
if (CAS.MULT[i,3] == '') {
toDelete <- c(toDelete, i)
}
}
}
}
CAS.MULT <- CAS.MULT[-1*toDelete,]
答案 1 :(得分:0)
如果不测试我的数据代码,很难确定,但这可能会有效。下面的代码不是循环,而是根据您在问题中指定的条件使用逻辑索引。这是矢量化的(意味着它一次在整个数据帧上运行,而不是按行运行),并且比逐行循环要快得多:
CAS.MULT.screened = CAS.MULT[!(CAS.MULT[,1] %% 1 == 0 |
as.numeric(substring(CAS.MULT[,2],1,1)) %% 1 == 0 |
CAS.MULT[,3] == ""), ]
有关检查值是否为整数的更多信息,请参阅this SO question。
另一件事:为了将来的参考,为了提高效率,你应该在循环之外定义你的函数,而不是每次循环都重新创建函数。