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

R——根据多个单元格的特征筛选Excel行,r,excel,R,Excel,我正在尝试删除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) { retu

我正在尝试删除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,])
          }
        }
      }
    }
    
    for(1中的i:nrow(CAS.MULT)){
    
    testInteger如果经常导致不希望的行为,则删除for循环中的行时应该非常小心。有多种方法可以处理此问题。例如,可以标记要删除的行,然后在删除后将其删除

    我注意到的另一件事是,在将列传递给函数以测试它们是否为整数之前,您正在将列转换为整数,因此对于传递给函数的所有值,您将错误地返回true

    也许这样的方法会奏效(如果没有可复制的例子,很难说它是否会奏效):


    toDelete如果不在您的数据上测试我的代码,很难确定,但这可能会起作用。下面的代码不使用循环,而是根据您在问题中指定的条件使用逻辑索引。这是矢量化的(意味着它一次对整个数据帧进行操作,而不是按行操作),比逐行循环快得多:

    CAS.MULT.screened = CAS.MULT[!(CAS.MULT[,1] %% 1 == 0 |  
                                   as.numeric(substring(CAS.MULT[,2],1,1)) %% 1 == 0 |
                                   CAS.MULT[,3] == ""), ]
    
    有关检查值是否为整数的详细信息,请参阅


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

    如果你发布一个数据帧的样本,会更容易帮助你。例如,将
    dput(head(CAS.MULT))的输出粘贴到你的问题中
    。醇类C12-C14乙氧基化壬基酚4摩尔醇类C12-16乙氧基化膨润土苄基(氢化牛脂烷基)二甲基硬脂酸铵络合物二硅质土煅烧结晶二氧化硅石英硅藻土煅烧2-二溴-3-硝基丙酰胺(DBNPA)抱歉,没有显示行--醇类C12-C14乙氧基化| | | | | | |壬基酚4摩尔| | | | | |醇类C12-16乙氧基化| | | | |膨润土苄基(氢化牛油烷基)二甲基铵| | | | | | | | 2| | | | |例如,最后一行需要编辑原始帖子以包含示例数据。不要只是将数据放入注释中。我遇到的问题(这就是我添加as.integer()函数的原因)是,即使是整数也会响应为“False”当我运行testInteger函数时,这样至少会给字母一个错误,给整数一个True。
    CAS.MULT.screened = CAS.MULT[!(CAS.MULT[,1] %% 1 == 0 |  
                                   as.numeric(substring(CAS.MULT[,2],1,1)) %% 1 == 0 |
                                   CAS.MULT[,3] == ""), ]