从两个向量(名称,值)创建命名列表

时间:2013-07-24 19:04:03

标签: r list constructor lapply named

有没有办法在两个向量上使用mapply来构建命名列表?第一个向量的类型为character,包含用于列表的名称,而第二个包含值。

到目前为止,我唯一的解决方案是:

> dummyList = list()
> addToList <- function(name, value) {
+ dummyList[[name]] <- value
+ }
> mapply(addToList, c("foo", "bar"), as.list(c(1, 2))
$foo
`1`

$bar
`2`

这似乎是一个相当人为的解决方案,但我无法弄清楚如何做到这一点。我遇到的问题是:

  1. 即使dummyList永远不会更改,也需要创建dummyList,并且在调用mapply后为空列表。

  2. 如果数字向量c(1, 2)未转换为列表,则调用mapply的结果是双精度的命名向量。

  3. 要解决问题2,我总是可以在两个向量上调用mapply,然后在结果上调用as.list,但似乎应该有一种方法可以直接创建一个列表值在向量中。

3 个答案:

答案 0 :(得分:69)

您可以使用setNames()

setNames(as.list(c(1, 2)), c("foo", "bar"))

(列表)或

setNames(c(1, 2), c("foo", "bar"))

(对于矢量)

答案 1 :(得分:8)

我与Ben分享了为什么你可能想要这样做以及他的建议。

为了好奇,mapply中有一种“隐藏”功能可以实现这一点:

x <- letters[1:2]
y <- 1:2
mapply(function(x,y) { y }, x, y, SIMPLIFY = FALSE,USE.NAMES = TRUE)
$a
[1] 1

$b
[1] 2

注意USE.NAMES的文档说:

  

USE.NAMES逻辑;如果第一个...参数有名称,则使用名称,或   如果是字符向量,请使用该字符向量作为名称。

答案 2 :(得分:0)

我提出的建议分两个步骤进行,非常简单,因此也许更容易理解:

test_list <- list(1, 2)
names(test_list) <- c("foo", "bar")

@ ben-bolker提出的建议行之有效,但只是想分享一个替代方案,以防您喜欢。

编码愉快!