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

Posted

技术标签:

【中文标题】在每 2 行之后生成一个升序值矩阵,在 R 中没有 for 循环【英文标题】:Generating a matrix of ascending values, after every 2 rows, without a for loop in R 【发布时间】:2017-11-07 06:03:59 【问题描述】:

我正在尝试在不使用 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 循环的情况下创建第一个矩阵的任何帮助,将不胜感激!

【问题讨论】:

replicate(3, lapply(seq(20,200,20), rep, 2) %&gt;% unlist) 感谢您的回复。这对我不起作用。我得到响应: > replicate(3, lapply(seq(20, 200, 20), rep, 2) %>% unlist) lapply 中的错误(seq(20, 200, 20), rep, 2) %>% unlist : 找不到函数“%>%” 您需要加载安装并使用库dplyr 来使用管道。或者,只需运行replicate(3, unlist(lapply(seq(20,200,20), rep, 2) ))。是的,支架丰富! 谢谢亚当。 %>% 现在可以工作了,您的代码可以正常工作。它会生成我想要的列表! 【参考方案1】:

您可以只生成从 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)

【讨论】:

感谢您的回复。这确实会生成一个数据框/矩阵,但不是我想要的。我是一个数据框/矩阵,它有 2 行,每行 20,然后是 2 行,每行 40。每第一行称为“y0”,每第二行称为“y1”。我已将其包含在原始帖子的顶部。您的建议虽然有帮助,但每次都会生成 20 行升序,名称分别为 y1、y2、y3 等 @Matthew Borg 请检查编辑,我相信我解决了问题 感谢误用。您的建议和编辑工作非常出色!我也感谢您回来编辑您的建议!

以上是关于在每 2 行之后生成一个升序值矩阵,在 R 中没有 for 循环的主要内容,如果未能解决你的问题,请参考以下文章

递归似乎并没有在复杂的代码中停止[关闭]

r语言如何生成矩阵偶数

在每 3 列之后拆分一行并将这 3 列作为新行传输到 r

二维矩阵中的二分搜索

R获取矩阵中每一行的最小值,并返回行名和列名

请问lingo中输入矩阵的标准格式是啥?