为什么 R 在转换为数字时将“0”作为字符强制转换为 NA?

Why does R coerce "0" as character to NA when converting to numeric?

我正在分析 R 中的基因序列。数据框的列是 SNP,行是个体。该 SNP 样本中每个个体的基因型被记录为一个字符,如 "CC"、"AC"、"AA"。由于每个 SNP 只有三种可能的基因型,R 将每一列读取为因子变量。

我想获得每对列之间的相关性,但为了做到这一点,我需要一个数字数据框。我已经能够以字符而不是因子的形式读取数据,并根据基因型将数据转换为 0、1 或 2(作为字符)。

但是当我试图将这些字符转换为数字时,R 将“0”强制转换为 NA。为什么会发生这种情况,我该如何预防?我不确定如何在此处显示我的数据,否则我想展示其中的一小部分。非常感谢任何帮助!

编辑:我的数据集名称是 'hgdpakt'。

这是我用来将字符数据从"CC"转换为“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])

希望对您有所帮助。

这个怎么样?可能有更有效的方法来找到次要等位基因,但我将继续使用基于您上面建议的 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() returns 一个列表,需要以某种方式将其转换回数据框)