2011-04-28 64 views
20

我試圖確定數據框中的值不匹配,但無法弄清楚如何執行此操作。如何從數據框中選擇不匹配的行?

# make data frame 
a <- data.frame(x = c(1,2,3,4)) 
b <- data.frame(y = c(1,2,3,4,5,6)) 

# select only values from b that are not in 'a' 
# attempt 1: 
results1 <- b$y[ !a$x ] 

# attempt 2: 
results2 <- b[b$y != a$x,] 

如果a = c(1,2,3)這個工程,因爲ab的倍數。但是,我試圖從數據幀y中選擇所有不在x中的值,並且不明白要使用哪個函數。

回答

37

如果我理解正確的話,你需要的%in%運營商的否定。像這樣的東西應該工作:

subset(b, !(y %in% a$x))

> subset(b, !(y %in% a$x)) 
    y 
5 5 
6 6 
+0

感謝@Chase,我花了一些時間試圖找出什麼'%在%'運營商的否定了,但可以不知道。這個答案也很有幫助,因爲它整齊地分組數據。 – djq 2011-04-28 18:50:05

+0

@celenius - '%in%'操作符返回一個邏輯向量,告訴我們第一個操作符和第二個操作符是否匹配。 '(b $ y%%a $ x)[1] TRUE TRUE TRUE FUESE FALSE'。 '!'意味着否定,所以會返回'!(b $ y%in%a $ x)[1] FALSE FALSE FALSE FALSE TRUE TRUE'。這有助於解釋事情嗎? – Chase 2011-04-28 19:15:03

17

嘗試設置差異函數setdiff。所以,你將有

results1 = setdiff(a$x, b$y) # elements in a$x NOT in b$y 
results2 = setdiff(b$y, a$x) # elements in b$y NOT in a$x 
+0

謝謝,這個工作完全 – djq 2011-04-28 18:48:21

相關問題