2017-08-25 81 views
1

我有一個數據幀:寫入數據幀到YAML [R

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

而且我想將信息寫入YAML文件具有特定結構:

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

     joe: 
      target: grey 
      code1: walk 
      code2: run 

我無法實現yaml輸出這個特定的結構。

+1

是否使用了YAML包?你現在怎麼樣? –

+0

@be_green yaml包是否提供保存功能? – Blaszard

+0

我想你會通過連接到文本文件並轉儲內容來保存,但as.yaml提供了一個很好的便利功能。這裏的問題是他的數據框架沒有正確表示數據。 –

回答

3

不使用套餐除外yaml輸出的版本:

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

我不知道你現在怎麼做,但這裏是我的解決方案,使用yaml和data.table庫。首先我們構造data.table,然後構造你想要的嵌套格式,然後從列表的每個元素中刪除名稱列,然後將其轉換爲yaml對象。 cat函數返回沒有操作的文本。

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 

然後您可以用write函數寫出文件。

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

你爲什麼要加載data.table,重新創建已經提供的'df',只做一個NULL賦值?你還沒有加載magrittr或dplyr來使用'%>%'管道。 – thelatemail

+0

兩個格式問題:'name'應該縮進2個選項卡,並且每個名稱組應該間隔一行。 – skurp

+0

data.table只是習慣,抱歉不包括圖書館電話 –