R

时间:2018-10-02 13:05:40

标签: r list vector named

我的任务看似非常简单,但无法弄清楚我在做什么错。我有一个包含字符向量和整数向量的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一起使用?

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

1 个答案:

答案 0 :(得分:0)

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

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之后,您需要遍历{em> lettersnumbers来设置名称,但是lapply仅允许您迭代一件事。 (并且在lapply内部分配 效果不佳,唯一重要的是返回的对象。)

如果您不能使用以上方法,而一次通过lst进行操作,则可以使用Map来遍历多个列表。我们将使用setNames函数而不是names<-(),当您尝试执行names(x) <-时会使用此函数。

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"