我有一个名为“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
下面是一个按索引删除一行的快速而简单的函数。
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。任何评论和改进这将是非常欢迎的!
为了完整起见,我将补充说,这也可以用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), ]