在每 2 行之后生成一个升序值矩阵,R 中没有 for 循环

Generating a matrix of ascending values, after every 2 rows, without a for loop in R

我试图在不使用 for 循环的情况下生成这个矩阵(以加快处理时间):

       Module 1 Module 2 Module 3
y0       20       20       20
y1       20       20       20
y0       40       40       40
y1       40       40       40
y0       60       60       60
y1       60       60       60
y0       80       80       80
y1       80       80       80
y0      100      100      100
y1      100      100      100
y0      120      120      120
y1      120      120      120
y0      140      140      140
y1      140      140      140
y0      160      160      160
y1      160      160      160
y0      180      180      180
y1      180      180      180
y0      200      200      200
y1      200      200      200

我一直在尝试应用函数,replicate() 和 do.call()。我最终得到了这段代码:

a = 10          # Number of increments
n1 = 100       # Sample size
m.fn <- function(n1, a) {
  b <- matrix(rep(n1), nrow = 2, ncol = 3)
  rownames(b) <- c("y0", "y1")
  c <- do.call(rbind, replicate(a, b, simplify=FALSE))

  colnames(c) <- c("Module 1", "Module 2", "Module 3")
  return(c)
}

生成与上面类似的矩阵,但所有条目均为 20。

我已尝试替换这些值,但收效甚微,如下所示:

 a = 10          # Number of increments
 n1 = 100       # Sample size
    m.fn <- function(n1, a) {
      b <- matrix(rep(n1), nrow = 2, ncol = 3)
      rownames(b) <- c("y0", "y1")
      c <- do.call(rbind, replicate(a, b, simplify=FALSE))
      c[3:(2 * a),] <- (n1 * seq(3, 2 * a))
      colnames(c) <- c("Module 1", "Module 2", "Module 3")
      return(c)
    }

这是结果:

       Module 1 Module 2 Module 3
y0       20       20       20
y1       20       20       20
y0       60       60       60
y1       80       80       80
y0      100      100      100
y1      120      120      120
y0      140      140      140
y1      160      160      160
y0      180      180      180
y1      200      200      200
y0      220      220      220
y1      240      240      240
y0      260      260      260
y1      280      280      280
y0      300      300      300
y1      320      320      320
y0      340      340      340
y1      360      360      360
y0      380      380      380
y1      400      400      400

作为参考,这是我用来创建所需矩阵的代码,涉及一个 for 循环:

    n.fn <- function(n1, a) {
  b <- matrix(rep(1, 3), nrow = 1, ncol = 3)
  for (no in 1:a) {
    c <- matrix(rep(n1 * no, 6), nrow = 2, ncol = 3)
    rownames(c) <- c("y0", "y1")
    b <- rbind(b, c)
  }
  b <- as.matrix(b[-1, 1:3])
  colnames(b) <- c("Module 1", "Module 2", "Module 3")
  return(b)
}
n <- n.fn(n1, a)

在不使用 for 循环的情况下创建第一个矩阵的任何帮助,将不胜感激!

您可以只生成从 20 到 400 的序列,重复多少列次数并排列成矩阵:

 df <- matrix(rep(rep(seq(from = 20, to = 400, by = 20), each = 2), times = 3), ncol = 3)

另一种方法是根据 Adam Quek 的建议使用复制:

df <- replicate(3, unlist(lapply(seq(20,200,20), rep, 2) )) 

现在只需为其指定所需的列名和行名即可:

colnames(df) <- paste("Module", 1:ncol(df))
rownames(df) <- rep(paste0("y", 0:1), nrow(df)/2)