【发布时间】:2015-09-21 05:45:27
【问题描述】:
我正在分析一种真菌的 SNP 数据,我试图通过将 Ns 更改为更频繁的等位基因的基因型来估算缺失的数据......见下文。 newdata 是我的 snps(行)和真菌分离物(列)的矩阵。每个 snp 的基因型都采用 0、1 和 N 格式,这就是我试图估算缺失的基因型的原因。
newdata_imputed=newdata
for (k in 1:nrow(newdata)){
u=newdata[k,]
x<-sum(u==0)
y<-sum(u==1)
all_freq=y/(x+y)
if (all_freq<0.5){
newdata_imputed[k,]=gsub("N",0,u)
} else{newdata_imputed[k,]=gsub("N",1,u)}
print(k)
}
但是,我不断收到此错误:
[1] 295
[1] 296
Error in if (all_freq < 0.5) { : missing value where TRUE/FALSE needed
很明显,代码运行但遇到问题后停止。请,有人可以告诉我我做错了什么吗?我是 R 的新手,任何建议都将不胜感激。
@akrun,我使用 for 循环的原因是因为它嵌套在另一个 for 循环中......所以在使用您的代码之后。
newdata=as.data.frame(newdata)
u=newdata
all_freq <- rowSums(u==1)/rowSums((u==1)|(u==0))
indx <- all_freq < 0.5
indx1 <- indx & !is.na(indx)
indx2 <- !indx & !is.na(indx)
newdata[indx1,] <- lapply(newdata[indx1,], gsub, pattern='N', replacement=0)
newdata[indx2,] <- lapply(newdata[indx2,], gsub, pattern='N', replacement=1)
newdata[] <- lapply(newdata, as.numeric)
我得到了奇怪的值
newdata[1:10,1:10]
V1 V2 V3 V4 V5 V6 V7 V8 V9 V10
1 3 3 3 3 3 3 3 3 3 3
2 2 2 2 2 2 2 2 2 2 2
3 3 3 3 3 3 3 3 3 3 3
4 1 1 1 1 1 1 1 1 1 1
请问“3”是从哪里来的????我应该只有 0 或 1
【问题讨论】:
-
看起来您有一行缺少
0或1值。 -
我认为如果您粘贴一些数据以使您的代码可重现,这将大有帮助。
-
看起来粘贴第 297 行可能最有帮助。
-
您可能不需要
for循环。您可以使用all_freq <- rowMeans(newdata==1); i1 <- all_freq<0.5并使用该索引来替换行值。 -
我猜
x + y == 0。然后all_freq == NaN和(all_freq<0.5) == NA。如果与NA一起使用,if会报告此错误。
标签: r