如何删除数据框中的行?

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

ABCD 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行。 例如,像这样:

  ABCD 1. 5 4 4 4 3. 5 4 4 4 5. 5 4 4 4 7. 5 4 4 4 

关键的想法是你形成一组你想删除的行,并保持该集合的补充。

在R中,一个集合的补码由' – '运算符给出。

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

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

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

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

你也可以使用一个所谓的布尔向量,也就是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。

按行号删除的问题

对于快速和肮脏的分析,您可以根据最佳答案按数字删除一个data.frame的行。 也就是说,

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

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

例如,假设您在检查数据并确定要删除的行的行号之后,导入了一个数据集,并按数字位置删除了行。 但是,在稍后的时间点,您可以查看原始数据并查看数据并重新sorting。 您的行删除代码现在将删除错误的行,更糟糕的是,您不太可能得到任何错误,警告您已经发生这种情况。

更好的战略

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

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

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

在您的数据框中创buildID列或使用任何列名来标识该行。 使用索引是不公平的删除。

使用subsetfunction来创build新的框架。

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