Powiedzmy, że mam taką listę:
x = list(list(1,2), list(3,4), list(5,6))
Chciałbym mieć listę zawierającą tylko pierwsze elementy zagnieżdżonej listy. Mogę to zrobić, zwracając inną taką listę
x1 = lapply(x, function(l) l[[1]])
Czy jest do tego notacja skrótowa?
Inna możliwość wykorzystuje fajną
purrr
bibliotekę:library(purrr) map(x, 1)
źródło
map
interpretuje wartości liczbowe jako wyodrębnianie, na przykład[[
Na przykładową listę możesz po prostu zrobić:
unlist(x)[ c(TRUE,FALSE) ]
ale to zależy od tego, czy każda podlista ma dokładnie 2 elementy.
Jeśli istnieje różna liczba elementów, możesz najpierw
sapply
obliczyć długości, a następnie obliczyć odpowiadające im pozycje pierwszego elementu (zobaczcumsum
), a następnie wybrać te wartości zunlist
listy ed. Ale do tego czasu przyjęta odpowiedź jest prawdopodobnie znacznie prostsza.Jeśli wszystkie listy podrzędne mają tę samą długość (ale mogą różnić się od 2), możesz zrobić coś takiego:
do.call( rbind, x)[,1]
lub jakiś inny rzut na wspólny obiekt. Ale wątpię, czy byłoby to tak skuteczne, jak to
lapply
podejście.źródło
Możemy użyć,
pluck
zrvest
którego wybiera pierwszy element z każdej zagnieżdżonej listyrvest::pluck(x, 1) #[[1]] #[1] 1 #[[2]] #[1] 3 #[[3]] #[1] 5
Zauważ, że to daje inny wynik ze
pluck
zpurrr
których wybiera 1st elementu (x[[1]]
)purrr::pluck(x, 1) #[[1]] #[1] 1 #[[2]] #[1] 2
źródło
Niezupełnie krótka notacja, ale można to również zrobić za pomocą spasowania:
Reduce(function(a, b) c(a, b[1]), x, init = c()) # [[1]] # [1] 1 # # [[2]] # [1] 3 # # [[3]] # [1] 5
źródło