Доступ к одноименным элементам списка в списке списков в R - PullRequest
12 голосов
/ 09 мая 2011

Часто я сталкиваюсь с ситуациями, когда мне нужно создать множество похожих моделей для разных переменных.Обычно я сбрасываю их в список.Вот пример фиктивного кода:

modlist <- lapply(1:10,function(l) {
   data <- data.frame(Y=rnorm(10),X=rnorm(10))
   lm(Y~.,data=data)
})

Теперь получить пример, например, очень просто:

lapply(modlist,predict)

Иногда я хочу извлечь один элемент из списка,Очевидный способ -

sapply(modlist,function(l)l$rank)

. Это делает то, что я хочу, но мне интересно, есть ли более короткий способ получить тот же результат?

Ответы [ 3 ]

27 голосов
/ 09 мая 2011

вероятно, это немного просто:

> z <- list(list(a=1, b=2), list(a=3, b=4))
> sapply(z, `[[`, "b")
[1] 2 4
> sapply(z, get, x="b")
[1] 2 4

и вы можете определить функцию как:

> `%c%` <- function(x, n)sapply(x, `[[`, n)
> z %c% "b"
[1] 2 4

а также это выглядит как расширение $:

> `%$%` <- function(x, n) sapply(x, `[[`, as.character(as.list(match.call())$n))
> z%$%b
[1] 2 4
19 голосов
/ 09 мая 2011

Я обычно использую способ Кохске , но вот еще один прием:

 sapply(modlist, with, rank)

Это более полезно, когда вам нужно больше элементов, например:

 sapply(modlist, with, c(rank, df.residual))

Насколько я помню, я украл его у Хэдли (я думаю, из документации plyr).

Основное различие между решениями [[ и with в том случае, если отсутствуют элементы.[[ возвращает NULL, если элемент отсутствует.with выдает ошибку , если в глобальном рабочем пространстве не существует объекта, имя которого совпадает с именем искомого элемента .Например:

dah <- 1
lapply(modlist, with, dah)

возвращает список единиц, когда modlist не имеет элемента dah.

1 голос
/ 27 декабря 2014

С новым пакетом Hadley lowliner вы можете предоставить map() числовой индекс или имя элемента для элегантного извлечения компонентов из списка. map() эквивалентно lapply() с некоторыми дополнительными трюками.

library("lowliner")

l <- list(
  list(a = 1, b = 2),
  list(a = 3, b = 4)
)

map(l, "b")
map(l, 2)

Существует также версия, которая упрощает результат до вектора

map_v(l, "a")
map_v(l, 1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...