使用两个参数拆分数据集并将子数据集保存在列表中

时间:2013-06-30 01:00:37

标签: r

我正在尝试使用两个参数(缺少值的分数和“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),]
 }}

2 个答案:

答案 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)])
                                }    }