【问题标题】:List of named vector from list of tibbles in RR中的小标题列表中的命名向量列表
【发布时间】:2019-03-07 14:48:14
【问题描述】:

我有一个看似非常简单的任务,但无法弄清楚我做错了什么。我有一个包含字符向量和整数向量的 3 个 Xx2 小标题列表(在示例中为 2x2)。我想将其转换为 3 个命名向量的列表,其中字母是向量元素,数字是名称。这是我的方法:

tbl <- tibble(numbers=c(1:2), letters=letters[1:2])
vec_names <- c("name1", "name2", "name3")
lst <- list(tbl, tbl, tbl)
names(lst) <- vec_names
lst_n <- lapply(lst, function(x) x[["letters"]]) 
lst_n <- sapply(vec_names, 
    function(x) names(lst_n[[x]]) <- lst[[x]]$numbers)

我得到了这个结果

lst_n
     name1 name2 name3
[1,]     1     1     1
[2,]     2     2     2

我看不出我的错误。 正在做

names(lst_n[["name1"]]) <- lst[["name1"]]$numbers

为我提供了我想要的“name1”,但为什么它不适用于 sapply?

我之前有 [] 并将其更改为 [[]] 以访问列表中的小标题而不是列表元素,但它仍然不起作用。任何人都可以帮忙吗?这似乎是一项非常基本的任务。

【问题讨论】:

标签: r list vector named


【解决方案1】:

这是一种方法,全部在一个匿名函数中:

z = lapply(lst, function(x) {
  result = x$letters
  names(result) = x$numbers
  return(result)
})

str(z)
# List of 3
#  $ name1: Named chr [1:2] "a" "b"
#   ..- attr(*, "names")= chr [1:2] "1" "2"
#  $ name2: Named chr [1:2] "a" "b"
#   ..- attr(*, "names")= chr [1:2] "1" "2"
#  $ name3: Named chr [1:2] "a" "b"
#   ..- attr(*, "names")= chr [1:2] "1" "2"

您的方法卡住了,因为在提取了所有 letters 之后,您需要遍历 both lettersnumbers 来设置名称,但 lapply 只允许你迭代一件事。 (并且分配 inside lapply 效果不佳,唯一重要的是返回的对象。)

如果您不能使用上述方法,通过lst 一次性完成,您可以使用Map,而不是迭代多个列表。我们将使用setNames 函数而不是names&lt;-(),这是当您尝试执行names(x) &lt;- 时调用的函数。

Map(
  f = setNames,
  object = lapply(lst, "[[", "letters"),
  nm = lapply(lst, "[[", "numbers")
)
# $`name1`
#   1   2 
# "a" "b" 
# 
# $name2
#   1   2 
# "a" "b" 
# 
# $name3
#   1   2 
# "a" "b" 

【讨论】:

  • 太棒了,谢谢格雷戈尔!我正在考虑您的第一个解决方案,但不确定在一个中分配值和数字是否可行。此外,您的第二个解决方案似乎非常优雅,我会尝试使用更多。再次感谢!
  • 很高兴您喜欢第二种解决方案,但我更喜欢第一种解决方案。第一种方式循环通过lst 一次,获取所有相关部分并以正确的方式将它们粘在一起以获得结果。第二种解决方案循环遍历lst 一次以获取字母,再次获取数字,然后遍历这些以将它们粘在一起形成结果。
  • 同意。就我而言,运行时并不重要,因为我只绘制结果,熟悉 Map() 对于其他应用程序似乎很有价值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-21
  • 1970-01-01
  • 2017-12-12
  • 1970-01-01
相关资源
最近更新 更多