如何删除数据帧中的行?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (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 
提问于
用户回答回答于

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

用户回答回答于

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

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

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

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

当然,别忘了“重新分配”myData如果你想完全删除那些行--否则,R只会打印结果。

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

扫码关注云+社区