2015-02-05 52 views
-3

df1和df2有列a,b。我想從df1中獲取子集數據,使得df1 $ a中的每個條目與df1 $ b一起在df2 $ a中與df2 $ b一起。如何在r中爲這個特定條件子集?

df1 
a b c 
1 m df1 
2 f df1 
3 f df1 
4 m df1 
5 f df1 
6 m df1 

df2 
a b c 
1 m df2 
3 f df2 
4 f df2 
5 m df2 
6 f df2 
7 m df2 

期望的輸出

df 
a b c 
1 m df1 
3 f df1 

我使用:

df <- subset(df1,(df1$a%in%df2$a & df1$b%in%df2$b)) 

但這給出相似的結果

df <-subset(df1,df1$a%in%df2$a) 
+0

可能做到這一點'df1 [(!df1 $ a%in%df2 $ a)&(!df1 $ b%in%df2 $ b),]' – 2015-02-05 13:04:02

+0

我改變了這個問題。請再讀一遍,這種方法也會給出與一個條件相同的結果。 – vk087 2015-02-05 13:10:13

+0

也許''df1 [(df1 $ a%in%df2 $ a)&(df1 $ b%in%df2 $ b),]'那麼? – 2015-02-05 13:13:07

回答

4

您可以使用包dplyr

library(dplyr) 
intersect(df1,df2) 
# a b 
#1 1 m 
#2 3 f 

編輯新data.frames與c列: 你可以使用函數semi_join(也是從dplyr):

semi_join(df1,df2,by=c("a","b")) 
# a b c 
#1 1 m df1 
#2 3 f df1 

其他選項,在base R
可以粘貼您的ab變量子集的data.frame:

df1[paste(df1$a,df1$b) %in% paste(df2$a,df2$b), ] 
# a b 
#1 1 m 
#3 3 f 

和新data.frames:

# a b c 
    # 1 1 m df1 
    # 3 3 f df1 
+0

我沒有針對使用粘貼,因爲它增加了運行時間。其他方法?? – vk087 2015-02-05 13:38:26

+0

@VaibhavKaushal是的,大衛的一個;-)或與包'dplyr',請參閱我的編輯 – Cath 2015-02-05 13:39:16

+1

我正在轉向相交的基地R,但dplyr超載很好:) – 2015-02-05 13:44:16

3

或者你可以做

Res <- rbind(df1, df2) 
Res[duplicated(Res), ] 
# a b 
# 7 1 m 
# 8 3 f 

EDIT1:每編輯,這裏有一個類似的data.table解決方案

library(data.table) 
Res <- rbind(df1, df2) 
setDT(Res)[duplicated(Res, by = c("a", "b"), fromLast = TRUE)] 
# a b c 
# 1: 1 m df1 
# 2: 3 f df1 

EDIT2:我看到@CathG開設了加盟戰線,所以這裏是我們如何與data.table

setkey(setDT(df1), a, b) ; setkey(setDT(df2), a, b) 
df1[df2, nomatch = 0] 
# a b c i.c 
# 1: 1 m df1 df2 
# 2: 3 f df1 df2 
相關問題