【问题标题】:Transform R dataframe into JSON将 R 数据帧转换为 JSON
【发布时间】:2020-03-26 23:35:04
【问题描述】:

嗨!我有以下格式的 R 数据框:

   user_id   email      segment name
     123    a@gmail.com   new     a
     234    b@gmail.com   old     b

如何将其转换为具有所需输出的 ​​JSON:

[
      {
        "user_id": "123",
        "email": "a@gmail.com",
        "custom_data": {
          "segment": "new"
        },
        "tags": [
          { "name": "a" }
        ]
      },
      {
        "user_id": "234",
        "email": "b@gmail.com",
        "custom_data": {
          "segment": "old"
        },
        "tags": [
          { "name": "b" }
        ]
      }
    ]

我正在使用包 jsonlite。

【问题讨论】:

    标签: r json jsonlite


    【解决方案1】:

    使用嵌入 data.frames 的列表列:

    dat <- read.table(header=TRUE, stringsAsFactors=FALSE, text="
       user_id   email      segment name
         123    a@gmail.com   new     a
         234    b@gmail.com   old     b")
    dat$custom_data <- lapply(dat$segment, function(a) data.frame(segment = a))
    dat$tags <- lapply(dat$name, function(a) data.frame(name = a))
    dat$segment <- dat$name <- NULL
    jsonlite::toJSON(dat, pretty = TRUE)
    # [
    #   {
    #     "user_id": 123,
    #     "email": "a@gmail.com",
    #     "custom_data": [
    #       {
    #         "segment": "new"
    #       }
    #     ],
    #     "tags": [
    #       {
    #         "name": "a"
    #       }
    #     ]
    #   },
    #   {
    #     "user_id": 234,
    #     "email": "b@gmail.com",
    #     "custom_data": [
    #       {
    #         "segment": "old"
    #       }
    #     ],
    #     "tags": [
    #       {
    #         "name": "b"
    #       }
    #     ]
    #   }
    # ] 
    

    一个不同之处在于,在您的中,"custom_data" 只是一个字典/哈希,而 jsonlite 将该字典放在一个列表中(长度为 1)。

    如果你是一个 tidyverse-junkie(不是那么糟糕):

    library(dplyr)
    dat %>%
      mutate(
        custom_data = purrr::map(segment, ~ tibble(segment = .x)),
        tags = purrr::map(name, ~ tibble(name = .x))
      ) %>%
      select(-segment, -name) %>%
      jsonlite::toJSON(., pretty = TRUE)
    

    如果你更喜欢data.table,那么

    library(data.table)
    as.data.table(dat)[
    ][, c("custom_data", "tags") :=
          .(lapply(dat$segment, function(a) data.frame(segment = a)),
            lapply(dat$name, function(a) data.frame(name = a)))
      ][, c("segment", "name") := NULL
        ][, jsonlite::toJSON(.SD, pretty = TRUE) ]
    

    或者如果你仍然喜欢magrittr 的“管道”流,

    library(magrittr)
    as.data.table(dat) %>%
      .[, c("custom_data", "tags") :=
            .(lapply(dat$segment, function(a) data.frame(segment = a)),
              lapply(dat$name, function(a) data.frame(name = a))) ] %>%
      .[, c("segment", "name") := NULL ] %>%
      jsonlite::toJSON(., pretty = TRUE)
    

    【讨论】:

      猜你喜欢
      • 2018-08-19
      • 1970-01-01
      • 1970-01-01
      • 2017-12-13
      • 2018-03-27
      • 1970-01-01
      • 2019-01-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多