R 如何删除数据框中的行?

R 如何删除数据框中的行?,r,row,R,Row,我有一个名为“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

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

关键思想是形成一组要删除的行,并保留该行的补码


在R中,集合的补码由“-”运算符给出

因此,假设
data.frame
被称为
myData

myData[-c(2, 4, 6), ]   # notice the -
当然,如果您想完全删除这些行,请不要忘记“重新分配”
myData
——否则,R只打印结果

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

myData您还可以使用所谓的布尔向量,也称为
logical

row_to_keep = c(TRUE, FALSE, TRUE, FALSE, TRUE, FALSE, TRUE)
myData = myData[row_to_keep,]
请注意,
运算符充当NOT,即
!真==假

myData = myData[!row_to_keep,]
与@mrwab的答案(+1 btw:)相比,这似乎有点麻烦,但可以动态生成逻辑向量,例如,当列值超过某个值时:

myData = myData[myData$A > 4,]
myData = myData[!myData$A > 4,] # equal to myData[myData$A <= 4,]
最后,一个非常巧妙的技巧是,您不仅可以将这种子集用于提取,还可以用于赋值:

myData$A[myData$A > 4,] <- NA
myData$A[myData$A>4,]按行号删除时出现问题
对于快速和不准确的分析,您可以根据顶部答案按数字删除data.frame的行。即

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

其他时候,您将有一个可以指定的正式排除标准,并且您可以使用R中的许多子集工具之一,根据该规则排除案例

在数据框中创建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)

通过简化的顺序更新了\u myData

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) , ]
mydata[which(1:nrow(mydata) %% 2 != 0) , ]
mydata[!which(1:nrow(mydata) %% 2 == 0) , ]
mydata[!which(1:nrow(mydata) %% 2 != 1) , ]
按顺序:

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) , ]
mydata[which(1:nrow(mydata) %% 2 != 0) , ]
mydata[!which(1:nrow(mydata) %% 2 == 0) , ]
mydata[!which(1:nrow(mydata) %% 2 != 1) , ]
按负序:

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) , ]
mydata[which(1:nrow(mydata) %% 2 != 0) , ]
mydata[!which(1:nrow(mydata) %% 2 == 0) , ]
mydata[!which(1:nrow(mydata) %% 2 != 1) , ]
或者如果要通过选择奇数进行子集划分:

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) , ]
mydata[which(1:nrow(mydata) %% 2 != 0) , ]
mydata[!which(1:nrow(mydata) %% 2 == 0) , ]
mydata[!which(1:nrow(mydata) %% 2 != 1) , ]
或者如果要通过选择奇数进行子集,则版本2:

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) , ]
mydata[which(1:nrow(mydata) %% 2 != 0) , ]
mydata[!which(1:nrow(mydata) %% 2 == 0) , ]
mydata[!which(1:nrow(mydata) %% 2 != 1) , ]
或者如果要通过过滤偶数来进行子集划分:

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) , ]
mydata[which(1:nrow(mydata) %% 2 != 0) , ]
mydata[!which(1:nrow(mydata) %% 2 == 0) , ]
mydata[!which(1:nrow(mydata) %% 2 != 1) , ]
或者,如果您想通过过滤偶数来子集,则版本2:

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) , ]
mydata[which(1:nrow(mydata) %% 2 != 0) , ]
mydata[!which(1:nrow(mydata) %% 2 == 0) , ]
mydata[!which(1:nrow(mydata) %% 2 != 1) , ]

从employee.data中删除Dan-无需管理新的data.frame

employee.data <- subset(employee.data, name!="Dan")

employee.data这里有一个快速而肮脏的函数,可以按索引删除一行

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), ])
  }
}

removowbyindex为了完整起见,我要补充一点,这可以通过
dplyr
以及使用
slice
来完成。使用它的优点是,它可以是管道工作流的一部分

df%
.
.
切片(-c(2,4,6))%>%
.
.
当然,您也可以在不使用管道的情况下使用它


df此外,您可能希望熟悉一些处理数据的常用术语。这通常被称为子集,如果你在谷歌搜索“r子集数据帧”,你会得到非常有用的结果。顺便说一下,欢迎来到Stackoverflow!除了@mrdwab的优秀答案之外,还添加了一些使用布尔向量进行子集设置的其他方法。@A5C1D2H2I1M1N2O1R2T1:R子集设置的UCLA常见问题解答已经移动。现在是了。别忘了记下里面的
。)如果您的数据帧只有一列,该怎么办。它似乎放弃了整个结构,并输出了values@road_to_quantdom在R中,集合的补码是由“-”运算符“->给出的,这是一个非常容易引起误解的措辞。负索引被删除,就这样,没有补码的概念。如果您使用logical并尝试使用
-
它将不起作用,因为logicals的补码运算符是
。行中c(2,4,6)的补码宁愿是setdiff(c(2,4,6),1:nrow(myData)),而不是c(-2,-4,-6),尽管两者在与
[
@Speldosa,
myData[-c(2,4,6),
一起使用时会产生相同的行。事实上,我建议您总是在
前面插入
,drop=F
在任何矩阵访问中。如果要排除它们怎么办?在你的例子3中,如果你