Kiedy wyłączam listę dat, zamienia je z powrotem w liczby. Czy to normalne? Jakieś obejście inne niż ponowne zgłoszenie jako data?
> dd <- as.Date(c("2013-01-01", "2013-02-01", "2013-03-01"))
> class(dd)
[1] "Date"
> unlist(dd)
[1] "2013-01-01" "2013-02-01" "2013-03-01"
> list(dd)
[[1]]
[1] "2013-01-01" "2013-02-01" "2013-03-01"
> unlist(list(dd))
[1] 15706 15737 15765
Czy to błąd?
?unlist
: Tam, gdzie to możliwe, elementy listy są wymuszane do wspólnego trybu podczas niepublicznej listy, więc wynik często kończy się jako wektor znakowy. Wektory zostaną przekształcone do najwyższego typu komponentów w hierarchii NULL <surowe <logiczne <całkowite <rzeczywiste <złożone <znak <lista <wyrażenie: listy par są traktowane jak listy.unlist
zwraca niezmienione dane wejściowe spoza listy. Nie wydaje mi się to wcale niewyraźne, ale dokumentacja powinna wspomnieć o tym, co dzieje się z atrybutami.Odpowiedzi:
do.call
to przydatna funkcja do „zrobienia czegoś” z listą. W naszym przypadku połącz go za pomocąc
. To nie jest rzadkościącbind
lubrbind
data.frames z listy w jeden wielki data.frame.To, co tutaj robimy, to konkatenacja elementów
dd
listy. Byłoby to analogiczne doc(dd[[1]], dd[[2]])
. Zauważ, żec
może być dostarczone jako funkcja lub jako znak.> dd <- list(dd, dd) > (d <- do.call("c", dd)) [1] "2013-01-01" "2013-02-01" "2013-03-01" "2013-01-01" "2013-02-01" "2013-03-01" > class(d) # proof that class is still Date [1] "Date"
źródło
do.call
), ale czasami może być przydatny w przypadku funkcji, które wymagają cytowania, npdo.call("+", as.list(c(1, 1)))
.Reduce
np.Reduce("c",dd)
Reduce
n-1 razy, gdzie n jest długością listy. Będzie to działać okropnie z większymi wektorami, analogicznie (właściwie identycznie) do tego, dlaczego iteracyjne tworzenie listy / wektorów jest słabe.Lub używając mruczenia, aby spłaszczyć listę dat do wektorów zachowujących typy:
list(as.Date(c("2013-01-01", "2013-02-01", "2013-03-01"))) %>% purrr::reduce(c)
prowadzi do
[1] "2013-01-01" "2013-02-01" "2013-03-01"
źródło