如何将R数据框列转换为YAML格式的字典数组?
问题:从R数据框生成指定格式的YAML结构
想要生成如下格式的YAML:
- name: Josiah Carberry roles: - investigation: lead - data curation: supporting
其中roles是字典数组,对应R中的数据框列表。但尝试的代码生成了多余的嵌套短横线,无法得到目标格式。
尝试的R代码
library(tibble) tibble( id = paste0("id", 1:2), roles = list( list(tibble(writing = "lead"), tibble(supervision = "supporting")), list(tibble(writing = "equal")) ) ) |> jsonlite::toJSON() |> jsonlite::parse_json() |> yaml::as.yaml(indent.mapping.sequence = TRUE) |> cat()
生成的错误结果
- id: id1 roles: - - writing: lead - - supervision: supporting - id: id2 roles: - - writing: equal
目标格式
- id: id1 roles: - writing: lead - supervision: supporting - id: id2 roles: - writing: equal
解决方案
问题根源是用tibble包裹了单个键值对,导致每个role被额外套了一层列表。直接用普通命名列表定义每个role,就能消除多余的短横线。
修改后的代码(方案一)
library(tibble) tibble( id = paste0("id", 1:2), roles = list( list(list(writing = "lead"), list(supervision = "supporting")), list(list(writing = "equal")) ) ) |> jsonlite::toJSON() |> jsonlite::parse_json() |> yaml::as.yaml(indent.mapping.sequence = TRUE) |> cat()
更简洁的写法(方案二)
不需要嵌套双层list,直接用c()合并命名列表,生成单一层级的列表数组:
library(tibble) tibble( id = paste0("id", 1:2), roles = list( c(list(writing = "lead"), list(supervision = "supporting")), list(writing = "equal") ) ) |> yaml::as.yaml(indent.mapping.sequence = TRUE) |> cat()
两种方式都能生成符合要求的YAML格式,roles下的每个键值对只会保留一层短横线。
内容的提问来源于stack exchange,提问作者arangaca
相关产品推荐
相关产品推荐

