R从多个向量创建嵌套列表
R creating a nested list from multiple vectors
我正在尝试创建一个嵌套列表,其中来自一个向量的值成为名称,并且重复该过程直到存储实际值的最后一个向量。我在想我下面的代码会起作用,但它不是
chips[[toString(aCor[i])]]=list(toString(bCor[i])=list(toString(cCor[i])=list(toString(dCor[i])=eCor[i])))
如果 aCor=c(1,2,2,1), bCor=c(4,5,6,4), cCor=c(3,3,2,3), dCor=c(1,4,5,1), eCor=c(1,3,4,7)
我期待这样的事情
结果列表
["1"=["4"=["3"=["1"= 7]]], "2"=["5"=["3"=["4"=3]],"6"=["2"=["5"=4]]]]
[1] 7
[1] 3
[1] 4
抱歉,如果预期的列表格式不正确。我不确定最好的方法。
如果有比我愿意接受建议的列表更好的方法,我会在 python 中使用字典,这是我能找到的最接近的可以复制它的字典。
我目前收到此错误
Error in parse(text = script) : parse error in text argument: unexpected '=' in function argument before
我们可以使用 purrr
或 dplyr
中的 lst
(或需要 setNames
),这将与赋值 (:=
)
nm1 <- 'a'
nm2 <- 'b'
dplyr::lst(!! nm1 := lst(!! nm2 := 5))
#$a
#$a$b
#[1] 5
如果我们需要创建嵌套 list
,请使用 for
循环
lst1 <- list()
for(i in seq_along(aCor)) {
an <- as.character(aCor[i])
bn <- as.character(bCor[i])
cn <- as.character(cCor[i])
dn <- as.character(dCor[i])
lst1[[an]][[bn]][[cn]][[dn]] <- eCor[[i]]
}
-输出
lst1
#$`1`
#$`1`$`4`
#$`1`$`4`$`3`
#$`1`$`4`$`3`$`1`
#[1] 7
#$`2`
#$`2`$`5`
#$`2`$`5`$`3`
#$`2`$`5`$`3`$`4`
#[1] 3
#$`2`$`6`
#$`2`$`6`$`2`
#$`2`$`6`$`2`$`5`
#[1] 4
数据
aCor <- c(1,2,2,1)
bCor <- c(4,5,6,4)
cCor <- c(3,3,2,3)
dCor <- c(1,4,5,1)
eCor <- c(1,3,4,7)
这是我在 akrun 的帮助下最终在这个问题上制作的代码,以及我在此 page 上找到的另一个由 IRTFM 编写的代码。
require(dplyr)
aCor <- c(1,2,2,1)
bCor <- c(4,5,6,4)
cCor <- c(3,3,2,3)
dCor <- c(1,4,5,1)
eCor <- c(1,3,4,7)
appendList <- function (x, val)
{
stopifnot(is.list(x), is.list(val))
xnames <- names(x)
for (v in names(val)) {
x[[v]] <- if (v %in% xnames && is.list(x[[v]]) && is.list(val[[v]]))
appendList(x[[v]], val[[v]])
else c(val[[v]])
}
x
}
chips <- list()
for(i in seq_along(aCor)) {
an <- as.character(aCor[i])
bn <- as.character(bCor[i])
cn <- as.character(cCor[i])
dn <- as.character(dCor[i])
#chips[[an]]=lst(!! bn := lst(!! cn := lst(!! dn := eCor[i])))
list1=lst(!! an := lst(!! bn := lst(!! cn := lst(!! dn:= eCor[i]))))
chips=appendList(chips,list1)
}
chips
输出:
[1] 7
$`2`
$`2`$`5`
$`2`$`5`$`3`
$`2`$`5`$`3`$`4`
[1] 3
$`2`$`6`
$`2`$`6`$`2`
$`2`$`6`$`2`$`5`
[1] 4
我正在尝试创建一个嵌套列表,其中来自一个向量的值成为名称,并且重复该过程直到存储实际值的最后一个向量。我在想我下面的代码会起作用,但它不是
chips[[toString(aCor[i])]]=list(toString(bCor[i])=list(toString(cCor[i])=list(toString(dCor[i])=eCor[i])))
如果 aCor=c(1,2,2,1), bCor=c(4,5,6,4), cCor=c(3,3,2,3), dCor=c(1,4,5,1), eCor=c(1,3,4,7)
结果列表
["1"=["4"=["3"=["1"= 7]]], "2"=["5"=["3"=["4"=3]],"6"=["2"=["5"=4]]]]
[1] 7
[1] 3
[1] 4
抱歉,如果预期的列表格式不正确。我不确定最好的方法。 如果有比我愿意接受建议的列表更好的方法,我会在 python 中使用字典,这是我能找到的最接近的可以复制它的字典。 我目前收到此错误
Error in parse(text = script) : parse error in text argument: unexpected '=' in function argument before
我们可以使用 purrr
或 dplyr
中的 lst
(或需要 setNames
),这将与赋值 (:=
)
nm1 <- 'a'
nm2 <- 'b'
dplyr::lst(!! nm1 := lst(!! nm2 := 5))
#$a
#$a$b
#[1] 5
如果我们需要创建嵌套 list
,请使用 for
循环
lst1 <- list()
for(i in seq_along(aCor)) {
an <- as.character(aCor[i])
bn <- as.character(bCor[i])
cn <- as.character(cCor[i])
dn <- as.character(dCor[i])
lst1[[an]][[bn]][[cn]][[dn]] <- eCor[[i]]
}
-输出
lst1
#$`1`
#$`1`$`4`
#$`1`$`4`$`3`
#$`1`$`4`$`3`$`1`
#[1] 7
#$`2`
#$`2`$`5`
#$`2`$`5`$`3`
#$`2`$`5`$`3`$`4`
#[1] 3
#$`2`$`6`
#$`2`$`6`$`2`
#$`2`$`6`$`2`$`5`
#[1] 4
数据
aCor <- c(1,2,2,1)
bCor <- c(4,5,6,4)
cCor <- c(3,3,2,3)
dCor <- c(1,4,5,1)
eCor <- c(1,3,4,7)
这是我在 akrun 的帮助下最终在这个问题上制作的代码,以及我在此 page 上找到的另一个由 IRTFM 编写的代码。
require(dplyr)
aCor <- c(1,2,2,1)
bCor <- c(4,5,6,4)
cCor <- c(3,3,2,3)
dCor <- c(1,4,5,1)
eCor <- c(1,3,4,7)
appendList <- function (x, val)
{
stopifnot(is.list(x), is.list(val))
xnames <- names(x)
for (v in names(val)) {
x[[v]] <- if (v %in% xnames && is.list(x[[v]]) && is.list(val[[v]]))
appendList(x[[v]], val[[v]])
else c(val[[v]])
}
x
}
chips <- list()
for(i in seq_along(aCor)) {
an <- as.character(aCor[i])
bn <- as.character(bCor[i])
cn <- as.character(cCor[i])
dn <- as.character(dCor[i])
#chips[[an]]=lst(!! bn := lst(!! cn := lst(!! dn := eCor[i])))
list1=lst(!! an := lst(!! bn := lst(!! cn := lst(!! dn:= eCor[i]))))
chips=appendList(chips,list1)
}
chips
输出:
[1] 7
$`2`
$`2`$`5`
$`2`$`5`$`3`
$`2`$`5`$`3`$`4`
[1] 3
$`2`$`6`
$`2`$`6`$`2`
$`2`$`6`$`2`$`5`
[1] 4