首页 文章

如何删除数据框中的行?

提问于
浏览
179

我有一个名为"mydata"的数据框,如下所示:

A  B  C   D 
1. 5  4  4   4 
2. 5  4  4   4 
3. 5  4  4   4 
4. 5  4  4   4 
5. 5  4  4   4 
6. 5  4  4   4 
7. 5  4  4   4

我想删除第2,4,6行 . 例如,像这样:

A  B  C   D
1. 5  4  4  4 
3. 5  4  4  4 
5. 5  4  4  4 
7. 5  4  4  4

7 回答

  • 68

    关键的想法是,您要形成一组要删除的行,并保留该集的补充 .

    在R中,集合的补集由' - '运算符给出 .

    所以,假设 data.frame 被称为 myData

    myData[-c(2, 4, 6), ]   # notice the -
    

    当然,如果你想完全删除那些行,别忘了"reassign" myData 否则,R只打印结果 .

    myData <- myData[-c(2, 4, 6), ]
    
  • 44

    您还可以使用所谓的布尔向量,也就是 logical

    row_to_keep = c(TRUE, FALSE, TRUE, FALSE, TRUE, FALSE, TRUE)
    myData = myData[row_to_keep,]
    

    请注意 ! 运算符充当NOT,即 !TRUE == FALSE

    myData = myData[!row_to_keep,]
    

    与@mrwab的答案(1 btw :))相比,这看起来有点麻烦,但是可以动态生成逻辑矢量,例如:列值超过某个值时:

    myData = myData[myData$A > 4,]
    myData = myData[!myData$A > 4,] # equal to myData[myData$A <= 4,]
    

    您可以将布尔向量转换为索引向量:

    row_to_keep = which(myData$A > 4)
    

    最后,一个非常巧妙的技巧是你可以使用这种子集不仅用于提取,还用于赋值:

    myData$A[myData$A > 4,] <- NA
    

    其中 A 列为 NA (不是数字),其中 A 超过4 .

  • 0

    按行号删除时出现问题

    对于快速和脏分析,您可以按照最佳答案按编号删除data.frame的行 . 即,

    newdata <- myData[-c(2, 4, 6), ]
    

    但是,如果您尝试编写健壮的数据分析脚本,通常应避免按数字位置删除行 . 这是因为数据中行的顺序将来可能会发生变化 . data.frame或数据库表的一般原则是行的顺序无关紧要 . 如果顺序很重要,则应将其编码为data.frame中的实际变量 .

    例如,假设您在检查数据并识别要删除的行的行号后导入数据集并按数字位置删除行 . 但是,在稍后的某个时刻,您将进入原始数据并浏览并重新排序数据 . 您的行删除代码现在将删除错误的行,更糟糕的是,您不太可能收到任何错误警告您已发生这种情况 .

    更好的战略

    更好的策略是根据行的实质和稳定属性删除行 . 例如,如果您有一个唯一标识每个案例的 id 列变量,则可以使用它 .

    newdata <- myData[ !(myData$id %in% c(2,4,6)), ]
    

    其他时候,您将有一个可以指定的正式排除标准,您可以使用R中的许多子集工具之一来排除基于该规则的案例 .

  • 0

    在数据框中创建id列,或使用任何列名来标识行 . 使用索引是不公平的删除 .

    使用 subset 函数创建新帧 .

    updated_myData <- subset(myData, id!= 6)
    print (updated_myData)
    
    updated_myData <- subset(myData, id %in% c(1, 3, 5, 7))
    print (updated_myData)
    
  • 6

    By simplified sequence :

    mydata[-(1:3 * 2), ]
    

    By sequence :

    mydata[seq(1, nrow(mydata), by = 2) , ]
    

    By negative sequence :

    mydata[-seq(2, nrow(mydata), by = 2) , ]
    

    Or if you want to subset by selecting odd numbers:

    mydata[which(1:nrow(mydata) %% 2 == 1) , ]
    

    Or if you want to subset by selecting odd numbers, version 2:

    mydata[which(1:nrow(mydata) %% 2 != 0) , ]
    

    Or if you want to subset by filtering even numbers out:

    mydata[!which(1:nrow(mydata) %% 2 == 0) , ]
    

    Or if you want to subset by filtering even numbers out, version 2:

    mydata[!which(1:nrow(mydata) %% 2 != 1) , ]
    
  • 8

    从employee.data中删除Dan - 无需管理新的data.frame .

    employee.data <- subset(employee.data, name!="Dan")
    
  • 273

    这是一个通过索引删除行的快速而脏的函数 .

    removeRowByIndex <- function(x, row_index) {
      nr <- nrow(x)
      if (nr < row_index) {
        print('row_index exceeds number of rows')
      } else if (row_index == 1)
      {
        return(x[2:nr, ])
      } else if (row_index == nr) {
        return(x[1:(nr - 1), ])
      } else {
        return (x[c(1:(row_index - 1), (row_index + 1):nr), ])
      }
    }
    

    它的主要缺点是row_index参数不遵循作为值向量的R模式 . 可能还有其他问题,因为我只花了几分钟编写和测试它,并且在过去几周内才开始使用R.对此的任何评论和改进都将非常受欢迎!

相关问题