如何在数据帧中删除行?(How do I delete rows in a data frame?)

2019-06-18 02:17发布

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

Answer 1:

其核心思想是你形成一套你要删除的行,并保持该组的补充。

“ - ”操作者在R,一集合的补集由给定。

因此,假设data.frame被称为myData

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

当然,不要忘了“重新分配” myData ,如果你想完全丢弃这些行---否则,R只是打印结果。

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


Answer 2:

你也可以用所谓的布尔向量,又名工作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。



Answer 3:

通过行数与删除问题

为了快速和肮脏的分析,你可以通过号码作为每顶端回答删除data.frame行。 也就是说,

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

不过,如果你试图写一个强大的数据分析脚本,你应尽量避免通过数字位置删除行。 这是因为您的数据行的顺序可能会在将来改变。 一个data.frame或数据库表的一般原则是,行的顺序并不重要。 如果订单事情做,这应该在data.frame实际变量进行编码。

例如,假设您导入的数据集和检查数据,并确定你想要删除行的行号后的数字位置删除的行。 然而,在以后的某个时候,你进入的原始数据,并有一个环顾四周,并重新排序数据。 你的行删除代码现在删错了行,更糟的是,你是不可能得到警告你,这已经发生的任何错误。

更好的策略

一个更好的策略是基于行的实质性和稳定的性能,以删除行。 举例来说,如果你有一个id列变量唯一识别每一种情况下,你可以使用它。

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

其他时候,你将有可能被指定一个正式的排除标准,你可以使用的许多子集的工具之一R中排除基于该规则的情况。



Answer 4:

在数据帧创建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)


Answer 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) , ]


Answer 6:

从employee.data删除丹 - 无需管理新data.frame。

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


Answer 7:

这里有一个快速和肮脏的功能,通过索引删除行。

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开始。 在这个任何意见和改进将是非常欢迎!



文章来源: How do I delete rows in a data frame?
标签: r row