我正在尝试实现一种方法来计算先前在本文中描述的主题组合的频率(https://www.nature.com/articles/ng.2870)。我是一名生物学家,也是R的初学者,因此很难做出看起来相当简单的任务......
我有2个制表符分隔的数据帧作为输入; dataframe1包含所有主题组合的列表,如下所示:
MotifCombID Motif1 Motif2 Motif3
1 Sp1 YY1 NFY
2 Sp1 YY1 KLF5
3 Sp1 YY1 ETS
Dataframe2包含每个字符串的所有主题事件,如下所示:
StringID Sp1 YY1 NFY KLF5 ETS
1 2 3 4 1 3
2 0 1 0 2 0
3 0 0 2 1 5
4 1 0 1 0 0
我真正想做的是使用df2中的数据计算df 1中列出的图案/模式的组合(例如,组合1:Sp1,YY1,NFY),对于df1中列出的所有组合。 / p>
所以我需要 1)搜索df1中的主题名称是否与df2中的主题名称匹配;
2)如果是,则检索所有列;
3)将每行中的值相乘,然后对所有值求和;
4)返回该主题组合的“频率”(步骤3的结果)。
E.g:
for MotifCombID 1(Sp1,YY1,NFY)=(2 * 3 * 4)+(0 * 1 * 0)+(0 * 0 * 2)+(1 * 0 * 1)= 24
for MotifCombID 2(Sp1,YY1,KLF5)=(2 * 3 * 1)+(0 * 1 * 2)+(0 * 0 * 1)+(1 * 0 * 0)= 6
for MotifCombID 3(Sp1,YY1,ETS)=(2 * 3 * 3)+(0 * 1 * 0)+(0 * 0 * 5)+(1 * 0 * 0)= 18
等...
这些数据帧相当大(df1:57155 x 3,df2:71 motifs x 99583字符串)所以我想以计算效率的方式做到这一点。
非常感谢您提供任何帮助,或者告诉我如何开始使用!
答案 0 :(得分:3)
由于您的数据是按行排列的,因此我将其转置为处理列式数据:
(dat2=data.frame(t(dat[-1])))
X1 X2 X3
Motif1 Sp1 Sp1 Sp1
Motif2 YY1 YY1 YY1
Motif3 NFY KLF5 ETS
(dat3=data.frame(t(dat1[-1])))
X1 X2 X3 X4
Sp1 2 0 0 1
YY1 3 1 0 0
NFY 4 0 2 1
KLF5 1 2 1 0
ETS 3 0 5 0
然后我写了一个计算组合的函数:
fun=function(x)sum(sapply(dat3[rownames(dat3)%in%x,],prod))
sapply(dat2,fun)
X1 X2 X3
24 6 18