【问题标题】:Convert dataframe back to nested list将数据框转换回嵌套列表
【发布时间】:2020-11-17 01:34:02
【问题描述】:

我正在尝试在 YAML、列表和数据框之间进行转换。我有一个如下所示的 YAML:

sheet1:
  var1:
    type: character
    description: description for my var1
  var2:
    type: character
    description: description for my var2
sheet2:
  var3:
    type: character
    description: description for my var3
  var4:
    type: character
    description: description for my var4

我正在阅读它并使用以下脚本转换为数据框:

library(yaml)
library(tidyverse)
yaml_file <- yaml::read_yaml("yaml.yaml")
mydf <- yaml_file %>% map(bind_rows) %>% bind_rows(.id = "sheet")

在某些情况下,我需要将数据帧转换回我原来的 YAML。以下是我目前不成功的尝试。

a <- split(mydf, mydf$sheet)
b <- lapply(a, function(x) split(x, f = x[["var"]]))
c <- rapply(b, as.list, how = "list")
cat(as.yaml(c)) # Not the same as my input

【问题讨论】:

  • 您可能无法回到原来的状态,因为在绑定列表时,您会丢弃名称
  • 小评:data.tabletidyverse语法最好不要混用; tidyverse 方式将是 mydf &lt;- yaml_file %&gt;% map(bind_rows) %&gt;% bind_rows(.id = "sheet")
  • @RonakShah,输出如下:list(sheet1 = list(var1 = list(type = "character", description = "description for my var1"), var2 = list(type = "character", description = "description for my var2")), sheet2 = list(var3 = list(type = "character", description = "description for my var3"), var4 = list(type = "character", description = "description for my var4")))

标签: r yaml


【解决方案1】:

首先正如@Mauritus 所说,让我们要么维护tidyverse,要么只维护data.table

这是tidyverse的一种方式:

library(tidyverse)
yaml_file <- yaml::read_yaml("yaml.yaml")
mydf <- yaml_file %>% 
     map(bind_rows, .id='var') %>% 
     bind_rows(.id = "sheet")
mydf

# A tibble: 4 x 4
  sheet  var   type      description            
  <chr>  <chr> <chr>     <chr>                  
1 sheet1 var1  character description for my var1
2 sheet1 var2  character description for my var2
3 sheet2 var3  character description for my var3
4 sheet2 var4  character description for my var4

这样可以确保没有数据丢失。在您的情况下,您丢失了 var 部分: 现在将其组合回yaml 文件:

 map(split(mydf[-1], mydf$sheet),~split(.x[-1], .x$var))%>%
     yaml::as.yaml()%>%
     cat()

sheet1:
  var1:
    type: character
    description: description for my var1
  var2:
    type: character
    description: description for my var2
sheet2:
  var3:
    type: character
    description: description for my var3
  var4:
    type: character
    description: description for my var4

【讨论】:

  • 短:yaml_file %&gt;% map_df(~bind_rows(.x, .id = 'var'), .id = 'sheet')
猜你喜欢
  • 2020-06-22
  • 1970-01-01
  • 2013-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多