【问题标题】:How to calculate the frequency of pattern combination occurrences?如何计算模式组合出现的频率?
【发布时间】:2018-02-02 15:24:20
【问题描述】:

我正在尝试实现一种方法来计算本文先前描述的主题组合的频率 (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 中的数据计算 df1 中列出的图案/图案组合(例如,组合 1:Sp1、YY1、NFY),用于 df1 中列出的所有组合。

所以我需要 1) 搜索 df1 中的主题名称是否与 df2 中的主题名称匹配;

2) 如果是,则检索所有列;

3) 将每一行中的值相乘,然后将所有值相加;

4) 返回该主题组合的“频率”(步骤 3 的结果)。

例如:

对于 MotifCombID 1 (Sp1, YY1, NFY) = (2*3*4)+(0*1*0)+(0*0*2)+(1*0*1) = 24

对于 MotifCombID 2 (Sp1, YY1, KLF5) = (2*3*1) + (0*1*2) + (0*0*1)+(1*0*0) = 6

对于 MotifCombID 3 (Sp1, YY1, ETS) = (2*3*3) + (0*1*0) + (0*0*5)+(1*0*0) = 18

等等……

这些数据帧相当大(df1:57155 x 3,df2:71 个图案 x 99583 个字符串),所以我想以一种计算效率高的方式来执行此操作。

非常感谢您提供的任何帮助或指导我从哪里开始!

【问题讨论】:

  • 如果您显示这个虚拟示例的预期输出会更清楚......
  • 当然!对于组合 1 (Sp1, YY1, NFY) = (2*3*4)+(0*1*0)+(0*0*2)+(1*0*1) = 24 对于组合 2 (Sp1, YY1, KLF5) = (2*3*1) + (0*1*2) + (0*0*1)+(1*0*0) = 6 对于组合 3 (Sp1, YY1, ETS) = ( 2*3*3) + (0*1*0) + (0*0*5)+(1*0*0) = 18 等等...
  • 如果您是 R 的初学者,可能仍然是时候切换到 python + pandas。当您想使用与 R 接口的易于实现的数据分析包时,R 很有用,但是如果您想编写自己的方法,从长远来看,python 可能会不那么令人沮丧。
  • 谢谢!你是过去 24 小时内第二个告诉我这个的人,肯定会为此付出努力。数据可视化/绘图呢?你认为 python 会像 R 一样优秀和友好吗?

标签: r pattern-matching combinations bioinformatics combinatorics


【解决方案1】:

由于您的数据是按行排列的,因此我将其转置以处理按列数据:

(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 

【讨论】:

  • 感谢战利品 Onyambu!这看起来真的很好!但是对于 X1,它给了我 12,猜它只是将两列相乘(我认为,YY1 x NFY)。你的代码太简洁了,我无法自己调试,我猜它是 %in%x 中的东西?
  • 在这个例子中?这太疯狂了,你不这么认为吗?因为我得到的是24 而不是12。让我试试别的:
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-07-08
  • 2020-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多