我正在尝试使用两个参数(缺少值的分数和“maf”)来分割我的数据集,并将子数据集存储在列表中。这就是我所做的(它不起作用)。任何帮助将不胜感激,
感谢。
library(BLR)
library(missForest)
data(wheat)
X2<- prodNA(X, 0.4) ### creating missing values
dim(X2)
fd<-t(X2)
MAF<-function(geno){ ## markers are in the rows
geno[(geno!=0) & (geno!=1) & (geno!=-1)] <- NA
geno <- as.matrix(geno)
## calc_Freq for alleles
n0 <- apply(geno==0,1,sum,na.rm=T)
n1 <- apply(geno==1,1,sum,na.rm=T)
n2 <- apply(geno==-1,1,sum,na.rm=T)
n <- n0 + n1 + n2
## calculate allele frequencies
p <- ((2*n0)+n1)/(2*n)
q <- 1 - p
maf <- pmin(p, q)
maf}
frac.missing <- apply(fd,1,function(z){length(which(is.na(z)))/length(z)})
maf<-MAF(fd)
lst<-matrix()
for (i in seq(0.2,0.7,by =0.2)){
for (j in seq(0,0.2,by =0.005)){
lst=fd[(maf>j)|(frac.missing < i),]
}}
答案 0 :(得分:3)
听起来你想要split
函数提供的结果。
如果你有一个向量,“frac.missing”和“maf”是根据“fd”中的值定义的(并且与fd中的行数具有相同的长度),那么这将提供分裂你正在寻找:
spl.fd <- split(fd, list(maf, frac.missing) )
如果您要将fd
基于maf(fd)
和frac.missing
的{{1}}值“分组”在for-loop指定的频段内,那么split
- 构造可能会执行当前代码无法完成的任务:
lst <- split( fd, list(cut(maf(fd), breaks = seq(0,0.2,by =0.005) ,
include.lowest=TRUE),
cut(frac.missing, breaks = seq(0.2,0.7,by =0.2),
right=TRUE,include.lowest=TRUE)
)
)
正确的论据可以满足基于“&lt;”的分裂的愿望。运算符,而cut
的默认操作假定为“&gt;”与'休息'的比较。另一个提供类似功能的功能是by
。
答案 1 :(得分:0)
以下代码完全符合我的要求:
Y<-t(GBS.binary)
nn<-colnames(Y)
fd<-Y
maf<-as.matrix(MAF(Y))
dff<-cbind(frac.missing,maf,Y)
colnames(dff)<-c("fm","maf",nn)
dff<-as.data.frame(dff)
for (i in seq(0.1,0.6,by=0.1)) {
for (j in seq(0,0.2,by=0.005)){
assign(paste("fm_",i,"maf_",j,sep=""),
(subset(dff, maf>j & fm <i))[,-c(1,2)])
} }