2015-09-10 17 views
0

所以我有兩個數據框,它們都有一列表示與DNA序列相連的ID號,另一列有DNA序列。我的兩個數據幀是原始數據,或者是已經過濾的數據,只包含原始數據的一個子集。我現在感興趣的是在原始數據框中生成一個.csv的所有序列,它們與過濾數據框中的內容不匹配。R中的非匹配的提取列表

因此,作爲目標的一個例子,我會在這裏定義一對dataframes有兩列(col1和COL2):

col1a<-c(1,2,3,4,5,6) 
col2a<-c("a","t","a","t","a","g") 
col1b<-c(1,3,5,6) 
col2b<-c("a","a","a","g") 
df1<-data.frame(col1a,col2a) 
df2<-data.frame(col1b,col2b) 

我的輸出要成爲第三數據框(DF3):

col1c <- c(2,4) 
col2c <- c("t","t") 
df3 <- data.frame(col1c,col2c) 

我知道我可以在%中使用%。我可以遠遠得到這樣的:

IN <- sum(df1$col1a %in% df2$col1b) #Output = 4 
NOTIN <- sum(!df1$col1a %in% df2$col1b) #Output = 2 

所以現在我正在尋找一種方式來輸出從「NOTIN」,使得它們可以寫成一個表中提到的行。我想生成我之前稱爲df3的示例數據框,作爲我的輸出。

任何幫助或建議,我們非常感激:)

回答

1

如果DF1包含DF2所有條目,它是那樣簡單

df1[!df1$col1a %in% df2$col1b, ] 
1

您可以使用anti_join

library(dplyr) 
anti_join(df1, df2, by = c("col1a" = "col1b")) 
+0

這是最可讀和功能的解決方案,+1 –

0

您也可以在data.table中執行此操作:

library(data.table) 
df1 <- data.table(df1, key = col1a) 
df2 <- data.table(df2, key = col1b) 
df1[!df2] 

隨着1.9.5版本(在GithHub,而不是在CRAN還),你可以使用,而不是設置一個關鍵on =語法:

df1[!df2, on = c(col1a = "col1b")]