如何得到字符串频率的向量如果我在矩阵中有字符串和它们的因子水平



我有很多字符串(几个k-mers的DNA读取)。它存储在r语言矩阵(或数组?)中,例如:

allKmers <- character()
allKmers <- c(allKmers,c("ACG", "CGT", "GTA", "TAC")) # V1
allKmers <- c(allKmers,c("GTA", "TAC", "ACG", "CGC")) # V2
allKmers <- c(allKmers,c("TAA", "AAT", "ATA", "TAA")) # V3
arrayKmers <- array(allKmers, dim = c(4,3), dimnames = NULL) # this is it!

然后我可以从因子中得到所有唯一的级别:

levels(as.factor(arrayKmers))
[1] "AAT" "ACG" "ATA" "CGC" "CGT" "GTA" "TAA" "TAC"

你看到了什么?8水平。

然后我想要得到3个有8个值的向量,对应于在V1, V2和V3中满足这些水平的频率,例如:

< 0, 1, 0, 0, 1, 1, 0, 1 > # V1 
< 0, 1, 0, 1, 0, 1, 0, 1 > # V2 
< 2, 0, 1, 0, 0, 0, 1, 0 > # V3 

是否有简单的方法得到这些向量?可能是一些很好的函数?我可以手动编码,但可能你知道一些更好的工具吗?然后我将计算dist矩阵,做聚类,等等。

您可以将V1, V2等与唯一级别进行匹配,然后将结果制成表格。

uKmers <- levels(as.factor(arrayKmers))
freqKmers <- apply(arrayKmers, 2, function(x){
  tabulate(match(x, uKmers), length(uKmers))
}
)
> t(freqKmers)
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
[1,]    0    1    0    0    1    1    0    1
[2,]    0    1    0    1    0    1    0    1
[3,]    1    0    1    0    0    0    2    0

这是一种方法:

library(qdapTools)
mtabulate(split(t(data.frame(arrayKmers)), 1:3))
##   AAT ACG ATA CGC CGT GTA TAA TAC
## 1   0   1   0   0   1   1   0   1
## 2   0   1   0   1   0   1   0   1
## 3   1   0   1   0   0   0   2   0

最新更新