R中tibbles列表中的命名向量列表
List of named vector from list of tibbles in R
我有一个看似非常简单的任务,但无法弄清楚我做错了什么。我有一个包含一个字符向量和一个整数向量的 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 一起使用?
我之前有 [] 并将其更改为 [[]] 以访问列表中的小标题而不是列表元素,但它仍然不起作用。谁能帮忙?这似乎是一项非常基本的任务。
这是一种方法,全部在一个匿名函数中:
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 letters
和 numbers
设置名称,但 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"
我有一个看似非常简单的任务,但无法弄清楚我做错了什么。我有一个包含一个字符向量和一个整数向量的 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 一起使用?
我之前有 [] 并将其更改为 [[]] 以访问列表中的小标题而不是列表元素,但它仍然不起作用。谁能帮忙?这似乎是一项非常基本的任务。
这是一种方法,全部在一个匿名函数中:
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 letters
和 numbers
设置名称,但 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"