0

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

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

但是当我试图将这些字符转换为数字时,R 将 '0's 强制为 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])

希望这可以帮助。

4

1 回答 1

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

于 2015-04-11T00:05:04.107 回答