2011-04-28 55 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