我有一个名为“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
为了完整起见,我将补充说,这也可以用dplyr使用slice来完成。使用它的好处是它可以成为管道工作流的一部分。
df <- df %>%
.
.
slice(-c(2, 4, 6)) %>%
.
.
当然,您也可以在没有管道的情况下使用。
df <- slice(df, -c(2, 4, 6))
“非向量”格式,-c(2,4,6)表示获取不在第2,4,6行的所有内容。对于一个使用范围的例子,假设你想删除前5行,你可以使用slice(df, 6:n())。有关更多示例,请参阅文档。
按行号删除的问题
对于快速和肮脏的分析,您可以根据顶部的答案通过数字删除data.frame的行。也就是说,
newdata <- myData[-c(2, 4, 6), ]
但是,如果试图编写健壮的数据分析脚本,通常应该避免按数字位置删除行。这是因为数据中的行顺序将来可能会改变。data.frame或数据库表的一般原则是行顺序不重要。如果顺序很重要,则应该将其编码在data.frame中的一个实际变量中。
例如,假设您导入了一个数据集,并在检查了数据并确定了要删除的行的行号之后,按数字位置删除了行。但是,在稍后的某个时刻,您将进入原始数据并查看并重新排序数据。您的行删除代码现在将删除错误的行,更糟糕的是,您不太可能得到任何警告您已经发生这种情况的错误。
更好的战略
更好的策略是根据行的实质性和稳定属性删除行。例如,如果您有一个唯一标识每种情况的id列变量,您可以使用它。
newdata <- myData[ !(myData$id %in% c(2,4,6)), ]
其他时候,您将有一个可以指定的正式排除标准,并且您可以使用R中的许多子集工具之一来基于该规则排除情况。
为了完整起见,我将补充说,这也可以用dplyr使用slice来完成。使用它的好处是它可以成为管道工作流的一部分。
df <- df %>%
.
.
slice(-c(2, 4, 6)) %>%
.
.
当然,您也可以在没有管道的情况下使用。
df <- slice(df, -c(2, 4, 6))
“非向量”格式,-c(2,4,6)表示获取不在第2,4,6行的所有内容。对于一个使用范围的例子,假设你想删除前5行,你可以使用slice(df, 6:n())。有关更多示例,请参阅文档。
关键思想是,你把想要删除的行组成一个集合,并保留这个集合的补项。
在R中,集合的补由'-'操作符给出。
假设data。frame是myData:
myData[-c(2, 4, 6), ] # notice the -
当然,如果您想完全删除这些行,不要忘记“重新分配”myData——否则,R只打印结果。
myData <- myData[-c(2, 4, 6), ]
简化顺序:
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) , ]