2015-09-28 30 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"