我有很多字符串(几个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。
答案 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