循环在R中创建几个矩阵(可能使用粘贴)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了循环在R中创建几个矩阵(可能使用粘贴)相关的知识,希望对你有一定的参考价值。
我想创建27个矩阵,其中包含2列和可变数量的行。我可以写出27行代码,如下所示:
x1 = cbind(rep(1,34), rnorm(34))
x2 = cbind(rep(1,36), rnorm(36))
....
x27 = cbind(rep(1,k), rnorm(k))
但它必须有更好的方法来做到这一点。我想到了一个循环,像这样:
aux = c(34, 36, ..., k) # auxiliar variable with number of rows for each matrix
for (i in 1:27) paste("x",i, sep="") = cbind(rep(1,aux[i]), rnorm(aux[i]))
但是,它不起作用。我觉得这是一项简单的任务,但我没有想法。
有帮助吗?
ps。:我想到了一个数组,但我无法使用它。也许一份清单可以完成这项工作,我不知道。
答案
你需要assign
:
for (i in 1:27) {
assign(paste("x",i,sep=""), cbind(rep(1,aux[i]), rnorm(aux[i])))
}
这将在您的全局环境中创建27个矩阵对象。
另一答案
如果您需要不同的行数,那么您肯定需要使用列表。请参阅以下示例:
首先,声明包含要生成的行数的aux
变量:
aux <- 50:77
让你的循环旋转:
x <- vector("list",27)
for (i in 1:27) {
x[[i]] <- cbind(rep(1,aux[i]), rnorm(aux[i]))
}
这将返回您的数据框列表。参见例如str(x)
为列表,str(x[[1]])
为第一个matrixe的结构。后者将返回:
num [1:50, 1:2] 1 1 1 1 1 1 1 1 1 1 ...
你是对的:它可以写得比这个提议好很多,寻找lapply
等等,但其他人会帮你解决这个棘手的问题:)
编辑后:添加了lapply
示例
如果您熟悉上面的循环(当然要查找?lapply
),请尝试下面的代码:
aux <- 50:77
fun <- function(x) cbind(rep(1,x), rnorm(x))
x <- lapply(aux, fun)
另一答案
如果您对列表没有任何反对意见,那么这是您的问题的另一个镜头:
aux <- 30:40
manoel <- sapply(aux, function(x) {
matrix(NA, ncol = 2, nrow = x)
}, simplify = FALSE)
> str(manoel)
List of 11
$ : logi [1:30, 1:2] NA NA NA NA NA NA ...
$ : logi [1:31, 1:2] NA NA NA NA NA NA ...
$ : logi [1:32, 1:2] NA NA NA NA NA NA ...
$ : logi [1:33, 1:2] NA NA NA NA NA NA ...
$ : logi [1:34, 1:2] NA NA NA NA NA NA ...
$ : logi [1:35, 1:2] NA NA NA NA NA NA ...
$ : logi [1:36, 1:2] NA NA NA NA NA NA ...
$ : logi [1:37, 1:2] NA NA NA NA NA NA ...
$ : logi [1:38, 1:2] NA NA NA NA NA NA ...
$ : logi [1:39, 1:2] NA NA NA NA NA NA ...
$ : logi [1:40, 1:2] NA NA NA NA NA NA ...
另一答案
下面的代码显示了我如何使用Joshua Ulrich的方法创建稍微复杂的矩阵。希望这个答案有助于展示创建对象时的一些灵活性。如果没有,我可以删除我的答案。
我怀疑这种方法可以很容易地修改以创建大小不同的矩阵,例如,通过将nrow
或ncol
设置为等于变量并使用rep(q, z)
和一些变量z
来复制matrix
或rbind
语句中的向量中的元素:
p1.c1 <- 0.10
p2.c1 <- 0.20
p3.c1 <- 0.30
p4.c1 <- 0.40
s1.c1 <- matrix(c(p1.c1, p1.c1, (1 - p1.c1),
p1.c1, p1.c1, (1 - p1.c1),
0, 0, 1), nrow=3, ncol=3, byrow = TRUE)
s2.c1 <- matrix(c(p2.c1, p2.c1, (1 - p2.c1),
p2.c1, p2.c1, (1 - p2.c1),
0, 0, 1), nrow=3, ncol=3, byrow = TRUE)
s3.c1 <- matrix(c(p3.c1, p3.c1, (1 - p3.c1),
p3.c1, p3.c1, (1 - p3.c1),
0, 0, 1), nrow=3, ncol=3, byrow = TRUE)
s4.c1 <- matrix(c(p4.c1, p4.c1, (1 - p4.c1),
p4.c1, p4.c1, (1 - p4.c1),
0, 0, 1), nrow=3, ncol=3, byrow = TRUE)
n <- 5
p.c1 <- c(p1.c1, p2.c1, p3.c1, p4.c1)
for (i in 1: (n - 1)) {
assign(paste('xs', i, '.c1', sep=""), matrix(c(p.c1[i], p.c1[i], (1-p.c1[i]),
p.c1[i], p.c1[i], (1-p.c1[i]),
0, 0, 1 ), nrow=3, ncol=3, byrow = TRUE))
}
identical(xs1.c1, s1.c1)
identical(xs2.c1, s2.c1)
identical(xs3.c1, s3.c1)
identical(xs4.c1, s4.c1)
for (i in 1: (n - 1)) {
assign(paste('ys', i, '.c1', sep=""), rbind(c(p.c1[i], p.c1[i], (1-p.c1[i])),
c(p.c1[i], p.c1[i], (1-p.c1[i])),
c(0, 0, 1)))
}
identical(ys1.c1, s1.c1)
identical(ys2.c1, s2.c1)
identical(ys3.c1, s3.c1)
identical(ys4.c1, s4.c1)
以上是关于循环在R中创建几个矩阵(可能使用粘贴)的主要内容,如果未能解决你的问题,请参考以下文章