使用for循环在列表中追加列表

时间:2020-07-22 10:18:46

标签: r

我是R语言的初学者,我面临一个相当简单的问题。我需要使用下面给出的数据迭代地创建列表的列表。

# First Vertical layer
P01<- list("S17","S18")
P02<- list("S1","S2")
P03<- list("S3","S4")

P1 <- list(P01, P02, P03)
# Second Vertical layer
P2 <- list("S22","S11","S12")

对于P1中的每个列表,我需要将其附加到P2中每个值的开头并将其记录在列表中。我需要什么:

lt <- list(list("S17", "S18", "S22"),list("S17", "S18", "S11"),list("S17", "S18", "S12"), list("S1", "S2", "S22"), ....)

到目前为止,我已经写过(但没用):

for (val in P1){
  for (lev in P2){
    J <- append(val,lev)
  }
}

我来自python背景,这种语法和数据类型在R中对我来说有点问题。任何帮助就足够了。

2 个答案:

答案 0 :(得分:2)

单线基础R解决方案。

lapply(P1, function(x) lapply(P2, function(y) c(unlist(x), y)))

答案 1 :(得分:2)

如果顺序无关紧要,则可以使用expand.grid,然后在unlist中使用lapply

x <- lapply(asplit(expand.grid(P1, P2), 1), function(x) as.list(unlist(x)))
x[1:2]
#[[1]]
#[[1]]$Var11
#[1] "S17"
#
#[[1]]$Var12
#[1] "S18"
#
#[[1]]$Var2
#[1] "S22"
#
#
#[[2]]
#[[2]]$Var11
#[1] "S1"
#
#[[2]]$Var12
#[1] "S2"
#
#[[2]]$Var2
#[1] "S22"

如果顺序很重要:

x <- lapply(asplit(rev(expand.grid(P2, P1)), 1), function(x) as.list(unlist(x)))
x[1:2]
#[[1]]
#[[1]]$Var21
#[1] "S17"
#
#[[1]]$Var22
#[1] "S18"
#
#[[1]]$Var1
#[1] "S22"
#
#
#[[2]]
#[[2]]$Var21
#[1] "S17"
#
#[[2]]$Var22
#[1] "S18"
#
#[[2]]$Var1
#[1] "S11"