Warum tötet unlist () Daten in R.


83

Wenn ich eine Liste von Daten aufliste, werden sie wieder in Zahlen umgewandelt. Ist das normal? Eine andere Problemumgehung als die erneute Bewerbung als. Datum?

> 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

Ist das ein Fehler?


2
Von ?unlist: Wenn möglich, werden die Listenelemente während der Auflistung in einen allgemeinen Modus gezwungen, sodass das Ergebnis häufig als Zeichenvektor endet. Vektoren werden zum höchsten Typ der Komponenten in der Hierarchie gezwungen. NULL <raw <logisch <Ganzzahl <real <komplex <Zeichen <Liste <Ausdruck: Paarlisten werden als Listen behandelt.
Arun

6
Ja, ich habe das Handbuch gelesen ... sie sind bereits in einem allgemeinen Modus
Thomas Browne

1
Ich bin damit einverstanden, dass das Verhalten nicht normal ist. Es wird jedoch immer empfohlen, die Dokumentation der von Ihnen verwendeten Funktion zu lesen.
Arun

7
@Arun Ich verstehe nicht, warum das relevant ist. Datumsvektoren sind intern ganze Zahlen, daher besteht das Problem darin, dass Attribute entfernt werden. In der Dokumentation wird dies nicht explizit erwähnt, aber die Auflistung kann Attribute im Allgemeinen nicht beibehalten.
Hadley

1
@Arun ja, da unlistnicht aufgelistete Eingaben unverändert zurückgegeben werden. Es scheint mir überhaupt nicht verschwommen zu sein, aber die Dokumentation sollte erwähnen, was mit Attributen passiert.
Hadley

Antworten:


93

do.callist eine praktische Funktion, um mit einer Liste "etwas zu tun". In unserem Fall verketten Sie es mit c. Es ist nicht ungewöhnlich, cbindoder rbinddata.frames aus einer Liste in einen einzigen großen data.frame.

Was wir hier tun, ist die Verkettung von Elementen der ddListe. Dies wäre analog zu c(dd[[1]], dd[[2]]). Beachten Sie, dass cdies als Funktion oder als Zeichen angegeben werden kann.

> 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"

7
Diese Antwort würde sich erheblich verbessern, wenn Sie etwas detaillierter erklären könnten, was Sie tun, damit andere sie später besser lesbar finden.
Dinre

Warum "herum c?
Alessandro Jacopson

3
@AlessandroJacopson das Zitat ist nicht notwendig (obwohl siehe Hilfedatei von do.call), kann aber manchmal für Funktionen nützlich sein, die zitiert werden müssen, z do.call("+", as.list(c(1, 1))).
Roman Luštrik

1
Ein weiterer guter Ansatz ist die Konvertierung von Liste zu Vektor mit Reduce, dh Reduce("c",dd)
Oriol Prat

2
Danke für den Code. Beantwortet die Frage nicht: Warum werden Listen nicht getötet?
24.

0

Oder verwenden Sie purrr , um eine Liste von Daten auf einen Vektor zu reduzieren , der Typen beibehält :

list(as.Date(c("2013-01-01", "2013-02-01", "2013-03-01"))) %>% purrr::reduce(c)

führt zu

[1] "2013-01-01" "2013-02-01" "2013-03-01"
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.