【问题标题】:Creating a named list from two vectors (names, values)从两个向量(名称、值)创建命名列表
【发布时间】:2013-07-24 19:04:03
【问题描述】:

有没有办法在两个向量上使用 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 的结果是双精度的命名向量。

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

【问题讨论】:

  • 相关:直接在代码中创建一个 tibble(而不是命名列表),并排属性名称和值,因为 2020 年的任何语言都应该能够:stackoverflow.com/questions/58427326 .. . 正确的地图代码内定义:应该不难。

标签: r list constructor lapply named


【解决方案1】:

您可以使用setNames()

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

(用于列表)或

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

(对于向量)

【讨论】:

    【解决方案2】:

    我同意 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 逻辑;如果第一个 ... 参数有名称,则使用名称,或者 如果是字符向量,则使用该字符向量作为名称。

    【讨论】:

    • 我不认为这是一个令人费解的用例,只是一个退化的用例。我需要将两个双精度数组与 USE.NAMES 不会自动拾取的某种 row.names 列组合起来,因此我必须手动将 row.names(x) 作为参数传递给函数不习惯:f = function(n, x, y) { if (y &gt; 0) { -1 * x } else { x } }; r = mapply(f, row.names(x), x, y, SIMPLIFY=F, USE.NAMES=T)data.frame(unlist(r)) 完成了这项工作。感谢您指出此功能!
    【解决方案3】:

    我的建议是分两步制作的,而且很简单,所以也许更容易理解:

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

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

    编码愉快!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-10
      相关资源
      最近更新 更多