我正在分析R中的基因序列。数据帧的列是SNP,行是个体。将该SNP的样品中的每个个体的基因型记录为字符,例如" CC"," AC"," AA"。由于每个SNP只有三种可能的基因型,因此R将每列作为因子变量读取。
我想获得每对列之间的相关性,但为了做到这一点,我需要一个数字数据帧。我已经能够以字符而不是因子的形式读取数据,并根据基因型将数据转换为0,1或2(作为字符)。
但是当我尝试将这些字符转换为数字时,R会将“0”强制转换为NA。为什么会发生这种情况?如何防止这种情况发生?我不知道如何在这里显示我的数据,否则我想展示一小部分样本。非常感谢任何帮助!
编辑:我的数据集的名称是' hgdpakt'。
这是我用来转换" CC"的字符数据的代码。 to" 1",例如:
genowt1 = allele.names(genotype(hgdpakt[,1],sep = "", reorder = "freq"))
这给了我基因型的第一个和第二个字符作为列表,按该等位基因的频率排序。接着,
A = paste(genowt1[1],genowt1[1],sep = "")
B = paste(genowt1[2],genowt1[2],sep = "")
C = paste(genowt1[1],genowt1[2],sep = "")
D = paste(genowt1[2],genowt1[1],sep = "")
完成此分配后,我使用以下代码分配每个基因型' 0',' 1'或者' 2'取决于携带基因型的次要等位基因的数量:
for(j in 1:length(hgdpakt[,1])){
if (hgdpakt[j,1] == A & (!is.na(hgdpakt[j,1]))){
hgdpakt[j,1] == 0
}else if (hgdpakt[j,1] == B & (!is.na(hgdpakt[j,1]))){
hgdpakt[j,1] = 2
}else if
(hgdpakt[j,1] == C || hgdpakt[j,1] == D || (is.na(hgdpakt[j,1])= TRUE)){
hgdpakt[j,1] = 1
}
}
在此之后,我使用了'as.numeric'转换为数字:
hgdpakt[,1] = as.numeric(hgdpakt[,1])
希望这有帮助。
答案 0 :(得分:1)
这个怎么样?可能有更有效的方法来查找次要等位基因,但我将继续使用基于您在上面建议的genetics
包的方法:
library("genetics")
set.seed(101)
genotypes <- c("CC", "AC", "AA")
dd <- as.data.frame(replicate(6,sample(genotypes,10,replace=TRUE)))
count_minor_alleles <- function(x) {
minor <- allele.names(genotype(x,sep="",reorder="freq"))[1]
sapply(strsplit(as.character(x),""),
function(z) sum(z==minor))
}
dd[] <- lapply(dd,count_minor_alleles)
cor(dd)
dd[] <- ...
是一个轻微的黑客,可以替换数据框的内容,而无需更改整体格式; as.data.frame(lapply(dd,count_minor_alleles))
也可以工作(基本问题是lapply()
返回一个列表,需要以某种方式将其转换回数据框)