2017-07-03 6 views
2

Ich erhalte eine benannte Liste von Datenrahmen unter Verwendung einer R-API für einen Datenanbieter. Unten würde ich eine ähnliche Struktur strukturieren.R Übergabe des Namens der Listenobjekte an die Listenobjekte selbst.

spec1 <- data.frame(speed = 100, wt = 5, price = 10) 
spec2 <- data.frame(speed = 1000, wt = 1, price = 100) 
spec3 <- data.frame(speed = 1, wt = 50, price = 5) 
mylist <- list(car = spec1,exotic = spec2, truck = spec3) 

Mein Ziel ist es, in einen flachen Datenrahmen wie unten zu drehen, so dass ich es in eine SQL-Datenbank exportieren.

car_type speed  wt  price 
-------- ------ ---- ----- 
car  100  5  10   
exotic  1000  1  100 
truck  1   50  5 

Mein Problem ist, dass die Kennung für „car_type“ wird als der Name des Datenrahmens in der Liste gespeichert, und ich weiß nicht, wie es Funktion einer Wiederholung zu übergeben Sie die Tabelle zu füllen.

Zum Beispiel verwende ich die folgende die car_type aus den Namen der Elemente in der Liste zu bekommen

car_type <- sapply(seq_along(mylist), function(x) names(mylist)[x]) 

Und dann verwende ich die im Anschluss an die eine car_type (substituiert durch „X“) in der wiederholen darunterliegende Tabellen und dann anhängen.

category <- lapply(mylist, function(y) rep("X" ,dim(y)[1])) 
mylist <- lapply(seq_along(mylist), function(x) 

Allerdings kann ich nicht zu verwalten scheinen die Namen in car_type gefunden passieren wieder in eine neue Kategorie Spalte in meinem Dataset erstellen, die bestehen bleiben wird, wenn es abgeflacht ist.

Antwort

0

Oder eine base R Option mit Map wäre, die 'car_type' aus dem names von ‚mylist zu erstellen 'und dann rbind die list Elemente

do.call(rbind, unname(Map(cbind, car_type = names(mylist), mylist))) 
# car_type speed wt price 
#1  car 100 5 10 
#2 exotic 1000 1 100 
#3 truck  1 50  5 
2

können Sie entweder eines der beiden:

dplyr::bind_rows(mylist, .id = "car_type") 
    data.table::rbindlist(mylist, idcol = "car_type") 

beide Ausgang:

 car_type speed wt price 
1:  car 100 5 10 
2: exotic 1000 1 100 
3: truck  1 50  5 
+0

LOL. Brilliant und so einfach. Hab so viele Stunden damit verbracht es herauszufinden. Vielen Dank @ friep – Luongjames

0

Vielleicht besser lesbar:

library(magrittr) 
mylist %>% do.call(rbind,.) %>% transform(car_type = rownames(.)) %>% set_rownames(NULL) 
Verwandte Themen