【问题标题】:Add replicate column to end of matrix将复制列添加到矩阵末尾
【发布时间】:2012-02-28 18:22:31
【问题描述】:

我有一个一列六行的矩阵。我想复制该列 i 次,但每次随机更改一个值,并在每次迭代后计算所有列的均值和方差。

例如:

values = rnorm(6, 6, 1); matrix1 = matrix(values, 6)

在 i=1 之后,看起来像:

values2 = values
values2[sample(1:6, 1)] = values2[sample(1:6, 1)]+runif(1, 0, 1)
matrix2 = matrix(c(values, values2), 6)

最后,我想输出一个如下所示的数据框:

i   mean   var
1   1.23  2.31
2   1.24  2.33 etc...

对于许多 i 的。我想有一种方法可以用循环来做到这一点,但我的技能不是我能弄明白的。感谢您的所有帮助!

【问题讨论】:

    标签: r for-loop


    【解决方案1】:

    如果你知道你这样做了多少次,最好事先构建你的最终矩阵,特别是如果 i 很大。但是,没有那个:

    jitter.func <- function(x, vec) {
      cell <- sample(1:length(vec), 1)
      vec[cell] <- vec[cell] + runif(1, 0, 1)
    
      return(c(mean=mean(vec), var=var(vec)))
    }
    
    
    i <- 10
    sapply(1:i, jitter.func, vec=values)
    

    【讨论】:

    • 这很好用。谢谢你,但也许我通过简化我的例子来打自己的脚。我用来代替 mean 和 var 的函数要求列名不同。我想根据迭代 i 标记 colnames。我在函数中添加了这一行:colnames(vec)=paste("col",1:length(vec),sep="")。但是我错误地说dimnames不等于数组扩展。我哪里错了?
    【解决方案2】:
    j <- 20 # Number of columns 
    i <- 6 # Number of rows
    vec <- matrix(rnorm(i,6,1),ncol=j,nrow=i)# vector replicated j times
    idx <- sample(seq(i),j,replace=TRUE) # j random rows
    vec[cbind(idx, seq(j))] <- vec[cbind(idx, seq(j))]+runif(j) # add random number to random row in each column
    apply(vec,2,plyr::each(mean,var)) # summary statistics
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-21
      • 1970-01-01
      • 1970-01-01
      • 2012-09-16
      • 1970-01-01
      • 2017-06-15
      • 1970-01-01
      • 2021-06-05
      相关资源
      最近更新 更多