从数据框中删除多个元素的标准方法

时间:2011-09-21 05:09:26

标签: r

从数据框中删除多个元素的最佳方法是什么?在我的情况下,我在数据框架中拥有该月的所有日期,并且想要删除几天。像下面这样的东西可以运行一天。

m[m$date!="01/31/11",]

但是,如果我尝试类似

的话
m[m$date!=c("01/31/11","01/30/11"),]

我收到一条警告信息

Warning message:
In `!=.default`(m$date, c("01/31/11", "01/30/11")) :
longer object length is not a multiple of shorter object length
Calls: [ ... [.data.frame -> Ops.dates -> NextMethod -> Ops.times -> NextMethod

它似乎工作了两天,但如果我将01/29/11添加到矢量,它显示所有日子,但是01/31/11。

4 个答案:

答案 0 :(得分:35)

nzcoops是他的建议。我在R聊天中提出了这个问题,Paul Teetor建议定义一个新功能:

`%notin%` <- function(x,y) !(x %in% y) 

然后可以按如下方式使用:

foo <- letters[1:6]

> foo[foo %notin% c("a", "c", "e")]
[1] "b" "d" "f"

毋庸置疑,这个小宝石现在已经在我的R profile中并经常使用。

答案 1 :(得分:13)

我认为你想要的是:

m[!m$date %in% c("01/31/11","01/30/11"),]

答案 2 :(得分:2)

很酷的方法是使用Negate函数创建新的:

`%ni%` <- Negate(`%in%`) 

比使用它来查找不相交的元素

答案 3 :(得分:0)

关于上述某些问题,这是一个符合tidyverse的解决方案。我使用了anti_join中的dplyr来达到相同的效果:

library(tidyverse)

numbers <- tibble(numbers = c(1:10))
numbers_to_remove <- tibble(number = c(3, 4, 5))

numbers %>%
  anti_join(numbers_to_remove)