Извлечение элементов списка с использованием имен - PullRequest
1 голос
/ 08 июля 2019

У меня есть список

ls<-list(c("a"="one","b"="two"),"x"="t4",c("y"="t5","z"="t6"))

Я бы хотел извлечь элементы списка по именам, а не по индексам. Есть ли способ сделать это?

Как и в

ls["a"]
 > "one"
ls["y"]
> "t5"

Я хочу только вывод "one" и "t5". Я буду использовать эти выходные данные, чтобы либо проанализировать их с какой-либо другой строкой, либо выполнить арифметику (если выходные значения являются числами) с другими переменными

Я нашел похожий вопрос, заданный ранее, R: получить элемент по имени из вложенного списка . Но это не работает для этого. Есть мысли?

Ответы [ 3 ]

2 голосов
/ 08 июля 2019

С plyr:

plyr::llply(lst,function(x) x["a"])

или:

Filter(Negate(is.na),plyr::llply(lst,function(x) x["y"]))
[[1]]
   y 
"t5"

Вы можете автоматизировать его, сделав его функцией.

Попытка автоматизации процесса(может быть медленным):

purrr::map(c("a","y"),
           function(x) lapply(lst, function(z) z[x]))
1 голос
/ 08 июля 2019

Мы можем просто unlist список и использовать оператор [[, который возвращает безымянный одноэлементный вектор:

unlist(ls)[["a"]]
# [1] "one"

unlist(ls)[["y"]]
# [1] "t5"

Если мы хотим сохранить имя, используйте [:

unlist(ls2)["a"]
#     a 
# "one" 

unlist(ls2)["y"]
#    y 
# "t5" 
1 голос
/ 08 июля 2019

В вашем конкретном случае может быть достаточно, учитывая, что имена компонентов уникальны (в противном случае возникает проблема с идентификацией).

## data
ls <- list(c(a = "one", b = "two"), x = "t4", list(c(y = "t5", z = "t6")))

getElement <- function(ls, name) unlist(ls)[[grep(name, names(unlist(ls)))]]

getElement(ls, "a")
#> [1] "one"
getElement(ls, "b")
#> [1] "two"
getElement(ls, "x")
#> [1] "t4"
getElement(ls, "y")
#> [1] "t5"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...