首页 > 解决方案 > 如何将 tibble 中的 JSON 列转换为新列

问题描述

我有一个 csv 文件,其中一列是 JSON。这是 JSON 的示例。

{"sg_template_id":"d-65910500a27a4992bd8ac7","sg_template_name":"trial-end"}
ID 电子邮件 参数
1 示例@yahoo.com {“sg_template_id”:“d-65910500a27a4992bd8ac7”,“sg_template_name”:“试用结束”}
2 示例@aol.com {“sg_template_id”:“d-7878787987877a27a4992b”,“sg_template_name”:“欢迎”}
structure(
  list(
    email = c("examole@yahoo.com\t", "example@aol.com\t"),
    id = c(1, 2),
    arrgs = c(
      "{ \"sg_template_id\" : \"d-65910500a27a4992bd8ac7\" , \"sg_template_name\" : \"trial-end\" }",
      "{ \"sg_template_id\" : \"d-7878787987877a27a4992b\" , \"sg_template_name\" : \"welcome\" }"
    )
  ),
  row.names = c(NA,-2L),
  class = c("tbl_df", "tbl", "data.frame")
)

我想用 CSV 文件中的所有列制作一个小标题。此外,我希望 JSON 中的所有键都转换为具有此 JSON 值的新列。

有没有办法快速轻松地做到这一点?

这是最终结果的样子

ID 电子邮件 sg_template_id sg_template_name
1 示例@yahoo.com d-65910500a27a4992bd8ac7 试用结束
2 示例@aol.com d-7878787987877a27a4992b 欢迎

标签: rjsontidyverse

解决方案


您可以使用包中的fromJSON函数jsonlite来读取 json 并使用map_df.

library(dplyr)
library(purrr)
library(jsonlite)

df %>%
  select(-arrgs) %>%
  bind_cols(map_df(df$arrgs, fromJSON))

# A tibble: 2 x 4
#  email                    id sg_template_id           sg_template_name
#  <chr>                 <dbl> <chr>                    <chr>           
#1 "examole@yahoo.com\t"     1 d-65910500a27a4992bd8ac7 trial-end       
#2 "example@aol.com\t"       2 d-7878787987877a27a4992b welcome     

推荐阅读