将数据帧转换为具有计数的矩阵

时间:2013-08-21 11:05:00

标签: r biopython reshape2 parser-combinators

我的数据文件结构如下:

OTU1    PIA0    1120
OTU2    PIA1    2
OTU2    PIA3    6
OTU2    PIA4    10
OTU2    PIA5    1078
OTU2    PIN1    24
OTU2    PIN2    45
OTU2    PIN3    261
OTU2    PIN4    102
OTU3    PIA0    16
OTU3    PIA1    59
OTU3    PIA2    27
OTU3    PIA3    180
OTU3    PIA4    200
OTU3    PIA5    251
OTU3    PIN0    36
OTU3    PIN1    61
OTU3    PIN2    156
OTU3    PIN3    590
OTU3    PIN4    277
OTU4    PIA0    401
OTU4    PIN0    2

我想创建一个矩阵,显示来自第二列的数据组合,将第一列作为组合计数的参考(显示多少次,每一次按第一列编号-OTU1,OTU2,OTU3测量) ,OTU4-来自第二列的每个数据在同一个OTU中彼此一起出现。它需要看起来像这样:

    PIA0  PIA1  PIA2  PIA3  PIA4  PIA5  PIN0  PIN1  PIN2  PIN3  PIN4
PIA0  1     1     1     1     1     1     2     1     1     1     1 
PIA1  1     0     1     2     2     2     1     2     2     2     2
PIA2  1     1     0     1     1     1     1     1     1     1     1
PIA3  1     2     1     0     2     2     1     2     2     2     2
PIA4  1     2     1     2     0     2     1     2     2     2     2
PIA5  1     2     1     2     2     0     1     2     2     2     2
PIN0  2     1     1     1     1     1     0     1     1     1     1
PIN1  1     2     1     2     2     2     1     0     2     2     2
PIN2  1     2     1     2     2     2     1     2     0     2     2
PIN3  1     2     1     2     2     2     1     2     2     0     2
PIN4  1     2     1     2     2     2     1     2     2     2     0

具有相同名称的行和列之间共享的数据反映了此数据单独出现在OTU中的次数。

有什么想法吗?

我已经读过关于R库'reshape2'和'acast'here的命令,但是我只能用它中的所有数据来改变矩阵的形状,而不是根据需要进行组合计数。我也一直在考虑一个Biopython脚本,但我认为用我对编程的一点知识来写下它会太大了。

目标是构建一个类似于示例中的矩阵,以便我可以使用这些数据运行CIRCOS online程序。

1 个答案:

答案 0 :(得分:4)

您可以使用dcast创建一个二进制矩阵,指示每个OTU中每个PI的存在,然后将其自身相乘以获得计数。

d <- read.fwf( textConnection("
OTU1    PIA0    1120
OTU2    PIA1    2
OTU2    PIA3    6
OTU2    PIA4    10
OTU2    PIA5    1078
OTU2    PIN1    24
OTU2    PIN2    45
OTU2    PIN3    261
OTU2    PIN4    102
OTU3    PIA0    16
OTU3    PIA1    59
OTU3    PIA2    27
OTU3    PIA3    180
OTU3    PIA4    200
OTU3    PIA5    251
OTU3    PIN0    36
OTU3    PIN1    61
OTU3    PIN2    156
OTU3    PIN3    590
OTU3    PIN4    277
OTU4    PIA0    401
OTU4    PIN0    2"), widths=c(8,8,10), header=FALSE, skip=1 )

library(reshape2)
A <- as.matrix( dcast( V1 ~ V2, data=d, length )[,-1]>0 )
#          PIA0     PIA1     PIA2     PIA3     PIA4     PIA5     PIN0     PIN1     PIN2     PIN3     PIN4    
# [1,]     TRUE    FALSE    FALSE    FALSE    FALSE    FALSE    FALSE    FALSE    FALSE    FALSE    FALSE
# [2,]    FALSE     TRUE    FALSE     TRUE     TRUE     TRUE    FALSE     TRUE     TRUE     TRUE     TRUE
# [3,]     TRUE     TRUE     TRUE     TRUE     TRUE     TRUE     TRUE     TRUE     TRUE     TRUE     TRUE
# [4,]     TRUE    FALSE    FALSE    FALSE    FALSE    FALSE     TRUE    FALSE    FALSE    FALSE    FALSE
t(A) %*% A
#              PIA0     PIA1     PIA2     PIA3     PIA4     PIA5     PIN0     PIN1     PIN2     PIN3     PIN4    
# PIA0            3        1        1        1        1        1        2        1        1        1        1
# PIA1            1        2        1        2        2        2        1        2        2        2        2
# PIA2            1        1        1        1        1        1        1        1        1        1        1
# PIA3            1        2        1        2        2        2        1        2        2        2        2
# PIA4            1        2        1        2        2        2        1        2        2        2        2
# PIA5            1        2        1        2        2        2        1        2        2        2        2
# PIN0            2        1        1        1        1        1        2        1        1        1        1
# PIN1            1        2        1        2        2        2        1        2        2        2        2
# PIN2            1        2        1        2        2        2        1        2        2        2        2
# PIN3            1        2        1        2        2        2        1        2        2        2        2
# PIN4            1        2        1        2        2        2        1        2        2        2        2
相关问题