我有一个名为“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[-(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) , ]

其他回答

为了完整起见,我将补充说,这也可以用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), ]

你也可以使用所谓的布尔向量,也就是逻辑:

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。

从员工中删除Dan。data -不需要管理新的data.frame。

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

使用Unique id的另一种方法是将数据子集化: *这来自一份我想删除化学标准的实际报告

Chem.Report<-subset(Chem.Report, Chem_ID!="Standard")

Chem_ID是列名。 !对于排除法很重要