2015-09-28 69 views
2

我有兩個數據幀。數據框的每一行都有不同數量的元素(實際上是基因名稱) - 我使用read.csv("file.csv",fill=TRUE)來讀取它們,所以在某些行中有一些填充。兩個數據幀中所有交叉點的表格

每個數據框都有相同的元素,只是它們的聚簇方式不同,所以它們在不同的組中。我想輸出兩個數據幀的交集表。

所以,如果

df1<-data.frame(c("a","b","NA","NA"),c("c","d","e","f"),c("g","h","i","NA"),c("j","NA","NA","NA")) 
df2<-data.frame(c("c","e","i","NA"),c("f","g","h","NA"),c("a","b","d","j")) 

然後我想要得到的東西是這樣的:

 df1[1,] df1[2,] df1[3,] df1[4,] 
df2[1,] 0  2  1  0 
df2[2,] 0  1  2  0 
df2[3,] 2  1  0  1 

現在看來似乎應該是我應該能夠與相交做到()和應用某種功能。儘管如此,我仍然無法擺脫困境。使用我最近的google-fu我能找到的是:Finding an efficient way to count the number of overlaps between interval sets in two tables?,但它處理數據表,並且正在查看線段中的數字重疊,正如我可以說的最好的,不是名稱列表。

有沒有人有任何想法如何做到這一點?

+1

它如果你的代碼生成'df1'和'df2'實際上工作的話會更好。 – Frank

+0

已編輯。道歉,我並不打算將它作爲執行代碼,相反,我只是想知道我正在嘗試做什麼。 – Ben

回答

3

你可以通過每一個數據幀的行循環,然後計算各行的交點的長度,而省略缺失值做到這一點:

apply(df1, 1, function(i) apply(df2, 1, function(j) length(na.omit(intersect(i, j))))) 
#  [,1] [,2] [,3] [,4] 
# [1,] 0 2 1 0 
# [2,] 0 1 2 0 
# [3,] 2 1 0 1 

樣本數據:

(df1<-rbind(c("a","b", NA, NA),c("c","d","e","f"),c("g","h","i", NA),c("j", NA, NA, NA))) 
#  [,1] [,2] [,3] [,4] 
# [1,] "a" "b" NA NA 
# [2,] "c" "d" "e" "f" 
# [3,] "g" "h" "i" NA 
# [4,] "j" NA NA NA 
(df2<-rbind(c("c","e","i", NA),c("f","g","h", NA),c("a","b","d","j"))) 
#  [,1] [,2] [,3] [,4] 
# [1,] "c" "e" "i" NA 
# [2,] "f" "g" "h" NA 
# [3,] "a" "b" "d" "j"