【问题标题】:How do I delete rows in a data frame?如何删除数据框中的行?
【发布时间】:2012-09-01 22:11:33
【问题描述】:

我有一个名为“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 

【问题讨论】:

  • 另外,您可能希望熟悉一些用于处理数据的常用术语。这通常称为子集,如果您在 Google 中搜索“r 子集数据框”,您会得到非常有用的 UCLA R FAQ page。顺便说一句,欢迎使用 Stackoverflow!
  • 除了@mrdwab 的出色答案外,还添加了一些使用布尔向量进行子集化的其他方法。
  • @A5C1D2H2I1M1N2O1R2T1:加州大学洛杉矶分校 R 子集的常见问题解答已移动。现在是here

标签: r dataframe row


【解决方案1】:

为了完整起见,我要补充一点,这可以使用dplyr 来完成,也可以使用slice 来完成。使用它的好处是它可以成为管道工作流的一部分。

df <- df %>%
  .
  .
  slice(-c(2, 4, 6)) %>%
  .
  .

当然,你也可以不使用管道。

df <- slice(df, -c(2, 4, 6))

“非向量”格式,-c(2, 4, 6) 表示在第 2、4 和 6 行获取所有的内容。对于使用范围的示例,假设您想删除第一个5 行,你可以做slice(df, 6:n())。如需更多示例,请参阅docs

【讨论】:

    【解决方案2】:

    关键思想是形成一组要删除的行,并保留该组的补集。

    在 R 中,集合的补码由“-”运算符给出。

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

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

    当然,如果您想完全删除这些行,请不要忘记“重新分配”myData——否则,R 只会打印结果。

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

    【讨论】:

    • 别忘了在里面注明,! ;)
    • 如果您的数据框只有一列怎么办。它似乎放弃了整个结构并输出值的向量
    • @road_to_quantdom,在其中添加drop = FALSE
    • “在 R 中,集合的补码由 '-' 运算符给出” -> 这是一个非常具有误导性的措辞。负索引被删除,就是这样,没有补码的概念。如果您使用逻辑并尝试使用-,它将不起作用,因为逻辑的补码运算符是!。行中 c(2,4,6) 的补码是 setdiff(c(2,4,6),1:nrow(myData)),而不是 c(-2, -4, -6) , 尽管两者在与 [ 一起使用时会产生相同的行。
    • @Speldosa,myData[-c(2, 4, 6),,drop=F]。事实上,我建议您始终在任何矩阵访问中的 ] 之前插入 ,drop=F
    【解决方案3】:

    这是一个快速而肮脏的函数,可以按索引删除行。

    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开始。任何CMET和改进都非常欢迎!

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

        按简化顺序:

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

        按顺序:

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

        按负序:

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

        或者如果您想通过选择奇数进行子集化:

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

        或者如果您想通过选择奇数进行子集化,版本 2:

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

        或者如果您想通过过滤偶数来进行子集化:

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

        或者如果您想通过过滤掉偶数来进行子集化,版本 2:

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

        【讨论】:

          【解决方案6】:

          删除行号 h3>的问题

          为了快速和脏脏分析,您可以根据顶部答案删除数据的行。按号码按号码。即,

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

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

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

          更好的策略 h3>

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

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

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

          【讨论】:

            【解决方案7】:

            在您的数据框中创建 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)
            

            【讨论】:

              【解决方案8】:

              您还可以使用所谓的布尔向量,即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。

              【讨论】:

              • 如果你想排除它们怎么办?在您的示例 3 中,如果您减弱了
              猜你喜欢
              • 2017-03-26
              • 2018-12-25
              • 2015-11-27
              • 1970-01-01
              • 2023-02-11
              • 1970-01-01
              • 1970-01-01
              • 2011-11-24
              相关资源
              最近更新 更多