R 重叠百分比

R percentage of overlaps

我有大约 25 个数据table。现在我想在某些 table 的第一列中找到重叠部分并提取它们。此外,我想知道有多少重叠以及多少百分比。输出应该是 table。这是一个例子:

表 1:

Gen          Estimate    Std. Error    p-Value
1007_s_at    -0.159699   0.07834       0.04265
1053_at      -0.174647   0.064535      0.0098976
121_at       0.1765678   0.05116854    0.0000657

表 2:

Gen        Estimate     Std. Error   p-Value
1494_f_at  0.2222467    0.0553653    0.0075838
121_at     0.873683     0.00898737   0.0088378
1316_at    0.098764     0.098456     0.048899
1007_s_at  0.89723      0.5675389    0.00007865

表 3:

Gen        Estimate     Std.Error    p-Value
1007_s_at  0.0864567    0.8931278    0.005542
121_at     0.2378590    0.0236586    0.00005667
1494_f_at  0.4597023    0.9875357    0.0091234

结果应该是:

Gen      
1007_s_at     
121_at  

Overlapping rate: 20%      

我尝试了 foverlaps 功能,但没有用。

我希望有人能提供帮助。谢谢!

更新:

这将是我合并所有 table 的第一列后的列表(它将很长 - 大约 200.000 行,混合了 46.000 个不同的基因 - 所以这只是一个简短的例子) :

gene A
gene B
gene C
gene D
gene A
gene E
gene F
gene A
gene C
gene A
gene B
gene D
gene A
gene E
gene B
gene A
gene C

所以我们有 6 倍的基因 A,3 倍的基因 B,3 倍的基因 C,2 倍的基因 D,2 倍的基因 E,只有 1 倍的基因 E。我们总共有 17 个基因。这使得基因 A 为 35%,基因 B 为 18%,基因 C 为 18%,基因 D 和基因 E 为 12%,基因 F 为 5%。这就是我要寻找的。可能没我想的那么难。

您可以为此使用 duplicated() 函数。

但首先你需要将第一列的所有字符串合并到一个向量中。您只需使用 c() 函数即可。如果您的表已经在一个列表中,或者在一个数据框中,那就更容易了。也许你也可以使用一个循环,你不需要写那么多,这取决于你的对象的名称。如果我有一个最小的工作示例,那将很有用。

merge.first <- c(table1[,1], table2[,1], table3[,1],.... )

比你搜索重复:

position.dup <- duplicated(merge.first)

以防万一你有两个以上的重复:

names(table(merge.first[position.dup])

用于计算您使用 sum() 函数的重复项数:

sum(position.dup)

以及您如何计算百分比我不明白您的意思。在您的示例中,您有两个重叠的十行,其百分比为 20% 而不是 28%。所以很遗憾,我不知道你需要什么。

编辑: 现在我得到了和你一样的结果:

> merge.vector
 [1] "A" "B" "C" "D" "A" "E" "F" "A" "C" "A" "B"
[12] "D" "A" "E" "B" "A" "C"
> round((table(merge.vector) / length(merge.vector) ) * 100)
merge.vector
 A  B  C  D  E  F 
35 18 18 12 12  6 

这一行做你想做的:

round((table(merge.vector) / length(merge.vector) ) * 100)