R - 如果我在矩阵中有字符串及其因子级别,如何获得字符串频率的向量

时间:2014-06-07 04:14:07

标签: r vector matrix cluster-analysis frequency

我有很多字符串(几个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矩阵,做聚类,blablabla。

2 个答案:

答案 0 :(得分:1)

您可以将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

答案 1 :(得分: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