Dies kommt viel im Umgang mit APIs.Tidy verschachtelte JSON-Baum
Die meiste Zeit, um eine echte Analyse zu machen, möchte ich meine Datensätze sauber halten, aber in der Regel erfordert dies eine Lösung für jeden Baumtyp und nicht etwas allgemeineres.
Ich dachte, es wäre schön, eine Funktion zu haben, die ordentlich Daten (wenn auch mit einer Tonne von der NA mit vielen verschiedenen Faktorstufen in tief verschachtelten Bäume erzeugt.
ich eine hackish Lösung haben, die folgt, mit unlist(..., recursive = FALSE)
+ eine Namenskonvention,
Aber Ich mag würde, um zu sehen, ob jemand hier vielleicht eine bessere Lösung, um diese Arten von Listenstrukturen aufzuräumen hat.
#####################
# Some Test Data
aNestedTree =
list(a = 1,
b = 2,
c = list(
a = list(1:5),
b = 2,
c = list(
a = 1,
d = 3,
e = list())),
d = list(
y = 3,
z = 2
))
############################################################
# Run through the list and rename all list elements,
# We unlist once at time, adding "__" at each unlist step
# until the object is no longer a list
renameVars <- function(lst, sep = '__') {
if(is.list(lst)) {
names(lst) <- paste0(names(lst),sep)
renameVars(unlist(lst, recursive = FALSE),sep = sep)
} else {
lst
}
}
res <- renameVars(aNestedTree)
können wir die Ausgabe überprüfen und sehen, dass wir eine seltsam genannt Objekt, Aber es gibt eine Methode zu diesem Wahnsinn.
> res
a________ b________ c__.a____1__ c__.a____2__ c__.a____3__
1 2 1 2 3
c__.a____4__ c__.a____5__ c__.b______ c__.c__.a____ c__.c__.d____
4 5 2 1 3
d__.y______ d__.z______
3 2
Jetzt habe ich dies in einem data.table
, also kann ich es gestalten.
library(data.table)
dt <- data.table(values = res, name = names(res))
# Use some regex to split that name up, along with data.table's tstrsplit
# function to separate them into as many columns as there are nests
> dt[,paste0('V',seq_along(s <- tstrsplit(dt$name,'[__]+(\\.|)'))) := s]
> dt
values name V1 V2 V3
1: 1 a________ a NA NA
2: 2 b________ b NA NA
3: 1 c__.a____1__ c a 1
4: 2 c__.a____2__ c a 2
5: 3 c__.a____3__ c a 3
6: 4 c__.a____4__ c a 4
7: 5 c__.a____5__ c a 5
8: 2 c__.b______ c b NA
9: 1 c__.c__.a____ c c a
10: 3 c__.c__.d____ c c d
11: 3 d__.y______ d y NA
12: 2 d__.z______ d z NA
Ich kann dann auswählen, für die Faktorkombinationen, die ich will (Oder dcast
/spread
). (Obwohl ich effektiv Tabellen auf der niedrigsten Ebene zerbricht, wenn sie existieren)
Ich dachte über Bind.c gehen und die do_unlist
herausziehen, um eine Funktion mit einer flexiblen Namenskonvention über Rcpp zu machen, aber mein C++ ist rostig, also dachte ich, ich würde hier posten, bevor ich etwas drastisches mache.
Haben Sie sich 'data.tree' angesehen? [data.tree-Einführung] (https://cran.r-project.org/web/packages/data.tree/vignettes/data.tree.html) [data.tree-Anwendung] (https: //cran.r -project.org/web/packages/data.tree/vignettes/applications.html) Und [diese Frage] (http://stackoverflow.com/questions/31339805/converting-json-format-to-csv-to-upload -data-table-in-r-to-produce-d3-bubble-cha) – dracodoc
schaue es jetzt, das sieht wirklich vielversprechend aus – Shape