2017-08-25 2 views
1

Ich habe einen Datenrahmen:schreiben Datenrahmen zu yaml R

df <- data.frame(name = c("bob","joe"), 
       target = c("yellow", "grey"), 
       code1 = c("fly", "walk"), 
       code2 = c("jump", "run")) 

Und ich möchte die Informationen in einer YAML-Datei mit einer bestimmten Struktur schreiben:

samples: 
     bob: 
      target: yellow 
      code1: fly 
      code2: jump 

     joe: 
      target: grey 
      code1: walk 
      code2: run 

Ich habe Probleme beim Erreichen einer Yaml-Ausgabe mit dieser spezifischen Struktur.

+1

Sie die yaml Paket verwenden? Wie versuchst du derzeit? –

+0

@be_green Bietet das YAML-Paket Speicherfunktionen? – Blaszard

+0

Ich würde denken, Sie würden nur speichern, indem Sie eine Verbindung zu einer Textdatei und den Inhalt zu entleeren, aber als .yaml bietet eine schöne Komfortfunktion. Das Problem hierbei ist, dass er hierarchische Daten hat, die vom data.frame nicht korrekt dargestellt werden. –

Antwort

3

Eine Version keine Pakete mit Ausnahme der yaml Ausgabe mit:

library(yaml) 
out <- as.yaml(list(samples=split(replace(df, "name", NULL), df$name))) 

# just to show it works: 
cat(out) 

#samples: 
# bob: 
# target: yellow 
# code1: fly 
# code2: jump 
# joe: 
# target: grey 
# code1: walk 
# code2: run 
1

Ich bin mir nicht sicher, wie Sie das jetzt tun, aber hier ist meine Lösung, mit den Bibliotheken yaml und data.table. Zuerst konstruieren wir die data.table, konstruieren dann das verschachtelte Format, das Sie möchten, entfernen dann die name-Spalte von jedem Element der Liste und konvertieren sie dann in ein yaml-Objekt. Die cat Funktion gibt den Text ohne Manipulation zurück.

library(data.table) 
library(yaml) 
library(magrittr) 

df <- data.table(name = c("bob","joe"), 
       target = c("yellow", "grey"), 
       code1 = c("fly", "walk"), 
       code2 = c("jump", "run")) %>% 
    split(by = "name") %>% 
    lapply(function(x) x[,name := NULL] %>% .[]) %>% 
    list(samples = .) %>% 
    as.yaml 

> cat(df) 
samples: 
    bob: 
    target: yellow 
    code1: fly 
    code2: jump 
    joe: 
    target: grey 
    code1: walk 
    code2: run 

Sie können dann mit der write Funktion die Datei schreiben.

write(df, "C:/filepath/file.txt") 
+0

Warum laden Sie data.table, um das bereits vorhandene 'df' wiederherzustellen, nur um eine NULL-Zuweisung zu machen? Und du hast noch nicht magrittr oder dplyr geladen, um die Pipe '%>%' zu verwenden. – thelatemail

+0

Zwei Formatierungsprobleme: Der 'Name' sollte zwei Registerkarten eingerückt sein und jede Namensgruppe sollte eine Zeile auseinander liegen. – skurp

+0

data.table ist nur Gewohnheit, tut mir leid, die Bibliotheksanrufe nicht miteinzubeziehen –

Verwandte Themen