必须有可能,但我找不到答案(或想到正确的搜索词)。
基本上我被困在一个双循环中,需要将2个不同的子名(每个单独的迭代1个)附加到变量。
基本示例:
var <- list()
i1 <- 0
i2 <- 0
while (i1 < 3) {
i1 <- i1 - 1
while (i2 < 3) {
i2 <- i2 - 1
var[[i1]][[i2]] <- c(1, 5, 8)
}
}
然而,像这样将两个子名串在一起似乎不起作用。我想得到9个结果(基于3x3迭代)名称为var11,var12,var13,var21等。
谢谢!
答案 0 :(得分:1)
好像您需要正确初始化i1
和i2
变量并增加它们而不是减少它们。然后,在内部循环中初始化子列表并将该子列表分配给var
列表。试试这个:
var <- list()
i1 <- 0
while (i1 < 3) {
i2<-0
i1 <- i1 + 1
var2<-list()
while (i2 < 3) {
i2 <- i2 + 1
var2[[i2]] <- sample(1:10,3)
}
var[[i1]]<-var2
}
另一种方法可能是初始化您的主要列表和所有子列表:
var<-vector("list",3)
for (i in 1:3) var[[i]]<-vector("list",3)
此时,您可以使用双下标分配值:
var[[i]][[j]]<-c(1,5,8)
假设i和j的范围从1到3,
答案 1 :(得分:1)
在R中,你可以在一个简单的单行中完成这个,但我会初步化一些变量以明确它。
i1start<-1
i1end<-3
i2start<-1
i2end<-3
result<-lapply(i1start:i1end, function(i1) lapply(i2start:i2end, function(i2) c(1,5,8)))
哪个应该返回一个列表列表,其中位置(i1,i2)的每个条目都是向量(1,5,8)。
让我们打破这个局面。如果你查看lapply(通过命令?lapply)来刷新函数,它会很有用。
如果我们只是运行内部的lapply,会发生什么?
lapply(i2start:i2end, function(i2) c(1,5,8))
#[[1]]
#[1] 1 5 8
#
#[[2]]
#[1] 1 5 8
#
#[[3]]
#[1] 1 5 8
lapply&#34;适用&#34;向量1,2,3(i2start:i2end)到函数,基本上是以下
#lapply does this
function(1) c(1,5,8)
function(2) c(1,5,8)
function(3) c(1,5,8)
然后将所有这些结果存储在一个列表中(因为它 l -apply)
然后我们在外部lapply调用中使用相同的概念,除了我们的函数已经改变。它不再是
function(i) c(1,5,8)
但实际上
#substituting 1:3 for i2start:i2end
function(i) lapply(1:3, function(i2) c(1,5,8))
现在我们正在打电话
lapply(1:3, function(i1) lapply(1:3, function(i2) c(1,5,8)))
基本上叫
function(1) lapply(1:3, function(i2) c(1,5,8))
function(2) lapply(1:3, function(i2) c(1,5,8))
function(3) lapply(1:3, function(i2) c(1,5,8))
并将这些函数的结果存储在列表中。然后每个函数调用运行内部函数,我之前解释过,当你把它们放在一起时,它会导致你的结果!在一行中发生了很多事情