如何将2个子名附加到R中的变量?

时间:2014-09-11 04:38:08

标签: r list variables

必须有可能,但我找不到答案(或想到正确的搜索词)。

基本上我被困在一个双循环中,需要将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等。

谢谢!

2 个答案:

答案 0 :(得分:1)

好像您需要正确初始化i1i2变量并增加它们而不是减少它们。然后,在内部循环中初始化子列表并将该子列表分配给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))

并将这些函数的结果存储在列表中。然后每个函数调用运行内部函数,我之前解释过,当你把它们放在一起时,它会导致你的结果!在一行中发生了很多事情