2011-09-21 90 views
13

什麼是用來刪除數據幀的多個元素的最佳方式刪除多個元素呢?在我來說,我有一個月的日子,在數據幀並希望刪除幾天。像下面的東西一天工作正常。標準的方式來從數據幀

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 

這似乎兩天的工作,但如果我添加到11年1月29日它顯示所有日子但01/31/11的載體。

回答

32

nzcoops是當場就他的建議。我提出在R這個問題洽談了一段時間回來和保羅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,並得到使用相當頻繁。

+0

不錯。我總是覺得它打破了我的注意力時,我必須鍵入像'!(x%的%Y)'...偉大的小費。 –

+1

我不認爲'dplyr'可以處理這個問題,例如, '濾波器(DF,FOO%notin%C( 「A」, 「C」, 「E」))' –

+0

@ MattO'Brien - 不知道是什麼這意味着...不要使用dplyr? – Chase

13

我認爲要:

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

這似乎並不時的日期是在'爲上班。 POSIXct'類! – vagabond

2

冷靜的方式是使用求反函數來創建新的一個:

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

比你可以用它來尋找不貫穿的元素