我的数据文件结构如下:
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程序。
答案 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