R - 根据多个单元格的特征筛选Excel行

时间:2015-05-26 15:05:26

标签: r excel

我正在尝试消除excel中具有以下功能的所有行:

  1. 第一列是整数
  2. 第二列以整数
  3. 开头
  4. 第三栏为空
  5. 我写的代码似乎无限期地运行。 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,])
          }
        }
      }
    }
    

2 个答案:

答案 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

另一件事:为了将来的参考,为了提高效率,你应该在循环之外定义你的函数,而不是每次循环都重新创建函数。