我有一个大型数据文件,如下所示:
Input_SNP Set_1 Set_2 Set_3 Set_4 Set_5 Set_6
1.09 0.162 NA 2.312 1.876 0.12 0.812
0.687 NA 0.987 1.32 1.11 1.04 NA
NA 1.890 0.923 1.43 0.900 2.02 2.7
2.801 0.642 0.791 0.812 NA 0.31 1.60
1.33 1.33 NA 1.22 0.23 0.18 1.77
2.91 1.00 1.651 NA 1.55 3.20 0.99
1.00 2.31 0.89 1.13 1.25 0.12 1.55
我想找到每列超过2且未计算任何NA的百分比:
Input_SNP Set_1 Set_2 Set_3 Set_4 Set_5 Set_6
0.33 0.166 0.000 0.166 0.000 0.286 0.166
我试过了mdd2 <- colMeans(as.matrix(mdd) > 2, na.rm=TRUE)
,但它没有用。 我如何获得上述输出?
然后我想在Set_1到Set_6中对值进行直方图分布。我已经使用hist(colMeans(as.matrix(df[,-1]) > 2, na.rm=TRUE))
我的下一个计划是计算我的Input_SNP百分比的z分数。我认为这可以通过
来完成 pop_sd <- sd(my row name)*sqrt((row length -1)/(row length))
pop_mean <- mean(row)
zscore <- (Input_SNP percentage minus pop_mean)/pop_sd
以上是我的伪代码尝试。如何完成这项工作?
然后我想在直方图上打印z分数:
我正在考虑以下事项:
jpeg("hist.jpg")
hist(colMeans(as.matrix(df[,-1]) > 2, na.rm=TRUE))
print(zscore)
dev.off()
印刷如何运作?
答案 0 :(得分:1)
有一个is.na.data.frame
方法返回一个与其参数相同维度的逻辑对象,可以与你想要的colSums结合使用(与!
一起给予否定)。
colSums(df>2, na.rm=TRUE)/colSums(!is.na(df))
Input_SNP Set_1 Set_2 Set_3 Set_4 Set_5 Set_6
0.333 0.167 0.000 0.167 0.000 0.286 0.167
答案 1 :(得分:0)
over2<-colMeans(apply(as.matrix(ds), c(1,2), function(x) ifelse(is.na(x)||x<2, 0, 1)))
percent_over2 <- colSums(over2)/dim(over2)[1]