在每 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)
我试图在不使用 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)