为什么R强迫" 0"转换为数字时作为NA的字符?

时间:2015-04-10 23:01:29

标签: r genetics

我正在分析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])

希望这有帮助。

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()返回一个列表,需要以某种方式将其转换回数据框)