我有一个名为"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
发布于 2012-09-08 12:39:37
关键思想是您形成一组想要删除的行,并保留该集合的补数。
在R中,集合的补码由“-”运算符给出。
因此,假设data.frame
名为myData
myData[-c(2, 4, 6), ] # notice the -
当然,如果您想完全删除这些行,请不要忘记“重新分配”myData
-否则,R只会打印结果。
myData <- myData[-c(2, 4, 6), ]
发布于 2012-09-08 18:57:18
您还可以使用所谓的布尔向量,也就是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。
发布于 2017-05-15 13:51:34
按行号删除的问题
对于快速和肮脏的分析,您可以根据最上面的答案按编号删除data.frame的行。也就是说,
newdata <- myData[-c(2, 4, 6), ]
但是,如果您正在尝试编写健壮的数据分析脚本,通常应该避免按数字位置删除行。这是因为数据中行的顺序将来可能会更改。data.frame或数据库表的一般原则是行的顺序不重要。如果顺序很重要,则应该将其编码到data.frame中的实际变量中。
例如,假设您导入了一个数据集,并在检查数据并确定了要删除的行的行号后,按数字位置删除了行。但是,在以后的某一时刻,您可以查看原始数据,并对数据进行重新排序。您的行删除代码现在将删除错误的行,更糟糕的是,您不太可能收到任何警告这种情况已经发生的错误。
更好的策略
更好的策略是根据行的实质性和稳定属性删除行。例如,如果您有一个唯一标识每个案例的id
列变量,则可以使用该变量。
newdata <- myData[ !(myData$id %in% c(2,4,6)), ]
其他时候,可以指定正式的排除条件,并且可以使用R中的许多子设置工具之一来排除基于该规则的情况。
https://stackoverflow.com/questions/12328056
复制相似问题