在数据帧上重复一个函数并存储输出

时间:2014-03-17 20:56:55

标签: r simulation repeat

我模拟了一个包含200行x 1000列的数据矩阵。它包含二项分布中的0和1。发生1的概率取决于我创建的概率矩阵。

然后,我转置此数据矩阵并将其转换为数据框。我创建了一个函数,它将缺少数据引入数据帧的每一行。在引入缺失数据后,该函数还将向数据框添加三列。一列是1000行中每一行的计算频率1。第二列是每行的0的计算频率。第3列是每行中缺失值的频率。

我想用相同的输入数据帧(没有丢失值的数据帧)重复此功能500次并输出三个数据帧:一个包含500列的所有0的计算频率(每个模拟一列) ,500列包含所有计算出的1的频率,1列有500列缺失的数据频率。

我已经看到mapply()用于类似的东西,但不确定它是否适用于我的情况。如何重复将函数应用于数据框并在每次重复该函数时存储在该函数中执行的每个计算的输出?

谢谢!

    ####Load Functions####
    ###Compute freq of 0's
    compute.al0 = function(GEcols){
      (sum(GEcols==0, na.rm=TRUE)/sum(!is.na(GEcols))) 
    }

    ###Compute freq of 1's
    compute.al1 = function(GEcols){
      (sum(GEcols==1, na.rm=TRUE)/sum(!is.na(GEcols)))
    }

    #Introduce missing data
    addmissing = function(GEcols){
      newdata = GEcols
      num.cols = 200
      num.miss = 10
      set.to.missing = sample(num.cols, num.miss, replace=FALSE) #select num.miss to be set to missing
      newdata[set.to.missing] = NA
      return(newdata) #why is the matrix getting transposed during this??
    }

    #Introduce missing data and re-compute freq of 0's and 1's, and missing data freq
    rep.missing = function(GEcols){
      indata = GEcols
      missdata = apply(indata,1,addmissing)
      missdata.out = as.data.frame(missdata) #have to get the df back in the right format
      missdata.out.t = t(missdata.out)
      missdata.new = as.data.frame(missdata.out.t)
      missdata.new$allele.0 = apply(missdata.new[,1:200], 1, compute.al0) #compute freq of 0's
      missdata.new$allele.1 = apply(missdata.new[,1:200], 1, compute.al1) #compute freq of 1's
      missdata.new$miss = apply(missdata.new[,1:200], 1, function(x) {(sum(is.na(x)))/200}) #compute missing
      return(missdata.new)  
    }


    #Generate a data matrix with no missing values
    datasim = matrix(0, nrow=200, ncol=1000) #pre-allocated matrix of 0's of desired size
    probmatrix = col(datasim)/1000 #probability matrix, each of the 1000 columns will have a different prob
    datasim2 = matrix(rbinom(200 * 1000,1,probmatrix), 
              nrow=200, ncol=1000, byrow=FALSE) #new matrix of 0's and 1's based on probabilities

    #Assign column names
    cnum = 1:1000
    cnum = paste("M",cnum,sep='')
    colnames(datasim2) = cnum
    #Assign row names
    rnum = 1:200
    rnum = paste("L",rnum,sep='')
    rownames(datasim2) = rnum

    datasim2 = t(datasim2) #data will be used in the transposed form
    datasim2 = as.data.frame(datasim2)

    #add 10 missing values per row and compute new frequencies
    datasim.miss = rep.missing(datasim2)

    #Now, how can I repeat the rep.missing function 
    #500 times and store the output of the new frequencies 
    #generated from each repetition?

2 个答案:

答案 0 :(得分:1)

更新

弗兰克,谢谢replicate()的建议。我可以通过在return(missdata.new)函数中将return(list(missdata.new))更改为rep.missing()来返回重复项。然后我用replicate(500,rep.missing(datasim2), simplify="matrix")调用该函数。

这几乎就是我想要的。我想做

    return(list(missdata.new$allele.0, missdata.new$allele.1, missdata.new$miss))
rep.missing()

并将这3个向量中的每一个作为列中的3列绑定数据帧返回。一个数据帧保存500次重复missdata.new$allele.0,一次保存500次重复missdata.new$allele.1等。

    replicate(500, rep.missing(datasim2), simplify="matrix")

答案 1 :(得分:0)

我不确定哪个部分是您不知道该怎么做的。 如果您不知道如何重复存储结果。一种方法是拥有一个全局变量,在你的函数中你做<< - 赋值而不是< - 或=。

     x=c()
     func = function(i){x <<- c(x,i) }
     sapply(1:5,func)

mapply用于在多个输入列表或向量上重复一个函数。

你想重复你的功能500次。所以你可以随时做        sapply(1:500,fund)