簡體   English   中英

R中的小標題列表中的命名矢量列表

[英]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 ,您需要通過迭代兩個 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" 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM