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