2017-08-27 1 views
0

Ich habe einen Datenrahmen. In jeder Zeile des Datenrahmens ist die letzte Spalte eine Zeichenfolge (data_listing). Die data_listing Zeichenkette ist selbst eine Reihe von Schlüssel: Wert-Paaren durch Kommata getrennt. Hier ist ein Beispiel für eine der Saiten:Wie füge ich eine Zeichenkette mit analysierbaren Feldern in Spalten, die zu einem Datenrahmen hinzugefügt werden können

> data_listing[1:2] 
[1] "id:4006422,memberId:2932850,price:999,make:Chevrolet,model:Cobalt,makeYear:2009,trim:LT,mileage:142000,sellerType:For Sale By Owner,dealerOptions:null,index:2"                                                                    
[2] "id:3987513,memberId:67473,price:26799,make:Audi,model:S5,makeYear:2013,trim:Prestige,mileage:44673,sellerType:Dealership,dealerOptions:{options:{VDPcarousel:true,allowUsed:true,calculator:true,carFaxIntegration:true,featuredCarousel:true,feed:true,homepageSpotlight:0,inlineSpotlight:11,limit:-1,map:true,monsterAds:true,pop:2,priceReduced:true,refresh:7,wrap:true,chat:false,inventoryComparison:true,standardFeatured:3}},index:3" 

Ich mag würde eine Spalte in dem Datenrahmen für jeden Wert in der data_listing Zeichenfolge erstellen. Jede Spalte verwendet den Schlüsselwert als Namen.

Wenn ich strsplit(data_listing, ",") ausführen, dann bekomme ich eine Liste von Zeichenketten. Jedes Listenelement enthält einen Zeichenvektor "key: value" -Paare.

Ich zögere, eine for-Schleife zu schreiben, um jedes Unterlistenelement zu grep und die Werte zu verschiedenen Spalten im ursprünglichen Datenrahmen hinzuzufügen, aber dies ist die einzige Möglichkeit, wie ich das herausfinden kann.

Ich habe auf transform, und tidyr::separate(), aber diese gierig für ein einzelnes Element in der Zeichenfolge gesucht, nicht für 28 Werte.

Wie würden Sie das lösen?

Antwort

1

würde ich so etwas tun:

data_listing <- c("id:4006422,memberId:2932850,price:999,make:Chevrolet,model:Cobalt,makeYear:2009,trim:LT,mileage:142000,sellerType:For Sale By Owner,dealerOptions:null,index:2", 
        "id:3987513,memberId:67473,price:26799,make:Audi,model:S5,makeYear:2013,trim:Prestige,mileage:44673,sellerType:Dealership,dealerOptions:{options:{VDPcarousel:true,allowUsed:true,calculator:true,carFaxIntegration:true,featuredCarousel:true,feed:true,homepageSpotlight:0,inlineSpotlight:11,limit:-1,map:true,monsterAds:true,pop:2,priceReduced:true,refresh:7,wrap:true,chat:false,inventoryComparison:true,standardFeatured:3}},index:3") 

library(tidyverse) 

# custom fxn for use on a single element in data_listing 
parser <- function(x) { 
    strsplit(x, ",",) %>% 
     unlist %>% 
     as.tibble %>% 
     separate(value, c("colnames", "values")) %>% 
     spread(colnames, values) 
} 

map_dfr(data_listing, parser) # apply to each element then rbind() together 

# console ... 
# A tibble: 2 x 28 
dealerOptions  id index  make makeYear memberId mileage model price 
<chr> <chr> <chr>  <chr> <chr> <chr> <chr> <chr> <chr> 
1   null 4006422  2 Chevrolet  2009 2932850 142000 Cobalt 999 
2  options 3987513  3  Audi  2013 67473 44673  S5 26799 
# ... with 19 more variables: sellerType <chr>, trim <chr>, allowUsed <chr>, 
# calculator <chr>, carFaxIntegration <chr>, chat <chr>, featuredCarousel <chr>, 
# feed <chr>, homepageSpotlight <chr>, inlineSpotlight <chr>, 
# inventoryComparison <chr>, limit <chr>, map <chr>, monsterAds <chr>, pop <chr>, 
# priceReduced <chr>, refresh <chr>, standardFeatured <chr>, wrap <chr> 
+0

Perfect. Das zweite bis letzte Element der Zeichenfolge (dealerOptions) ist ein komplexes Element mit Unterelementen. Ich werde Ihrer Logik folgen und kopieren müssen, was Sie getan haben, um die DealerOptions auch in neue Datenspalten zu verbreiten, wenn dealerOptions vorhanden ist. –

Verwandte Themen