【问题标题】:Convert R data frame to custom json将 R 数据框转换为自定义 json
【发布时间】:2021-09-27 23:04:27
【问题描述】:

我想在最后将数据框更改为自定义 json 格式。标签是从日期和压力列创建的,名称是值,列名是组名和需要。

以下是生成用于复制此问题的数据框的方法

    df<-setNames(
  data.frame(
    t(data.frame(c("",1,2,0,20,"2b9c5fb7-72a4-4482-baa1-34cc37522d24","Yes","210521"),c("",2,3,20,40,"7f615aea-330f-4c67-8101-0ae501c793cd","No","210522")))
    ,row.names = NULL,stringsAsFactors = FALSE
  ), 
  c("notes","instanceNum","modifyCount","startTime","endTime","uniqueId","Pressure","Date")
)

这是所需的自定义 json 格式。任何指导表示赞赏

                    {
                        "labels": [
                            {
                                "name": "Yes",
                                "group": "Pressure"
                            },
                            {
                                "name": "210521",
                                "group": "Date"
                            }
                        ],
                        "notes": "",
                        "instanceNum": 1,
                        "modifyCount": 2,
                        "startTime": 0,
                        "endTime": 20,
                        "uniqueId": "2b9c5fb7-72a4-4482-baa1-34cc37522d24"
                    },
                    {
                        "labels": [
                            {
                                "name": "No",
                                "group": "Pressure"
                            },
                            {
                                "name": "210522",
                                "group": "Date"
                            }
                        ],
                        "notes": "",
                        "instanceNum": 2,
                        "modifyCount": 3,
                        "startTime": 20,
                        "endTime": 40,
                        "uniqueId": "7f615aea-330f-4c67-8101-0ae501c793cd"
                    }

【问题讨论】:

    标签: r arrays json dataframe jsonlite


    【解决方案1】:

    试试这些选项:

    基础R

    melted <- reshape2::melt(df[,c("instanceNum","Pressure","Date")], 
                             id.vars="instanceNum", variable.name="group", value.name="name")
    melted$group <- as.character(melted$group)
    # "nest" the other columns against a single row of "instanceNum"`
    melted <- by(melted, melted[,"instanceNum"], function(z) {
      out <- out <- z[1,1,drop=FALSE]
      out$labels <- list(z[,-1])
      out
    })
    df2 <- merge(df[,setdiff(names(df), c("Pressure", "Date"))],
                 do.call(rbind, melted), by = "instanceNum")
    df2
    #   instanceNum notes modifyCount startTime endTime                             uniqueId                      labels
    # 1           1                 2         0      20 2b9c5fb7-72a4-4482-baa1-34cc37522d24 Pressure, Date, Yes, 210521
    # 2           2                 3        20      40 7f615aea-330f-4c67-8101-0ae501c793cd  Pressure, Date, No, 210522
    

    jsonlite::toJSON(df2, pretty = TRUE) 的输出是:

    [
      {
        "instanceNum": "1",
        "notes": "",
        "modifyCount": "2",
        "startTime": "0",
        "endTime": "20",
        "uniqueId": "2b9c5fb7-72a4-4482-baa1-34cc37522d24",
        "labels": [
          {
            "group": "Pressure",
            "name": "Yes"
          },
          {
            "group": "Date",
            "name": "210521"
          }
        ]
      },
      {
        "instanceNum": "2",
        "notes": "",
        "modifyCount": "3",
        "startTime": "20",
        "endTime": "40",
        "uniqueId": "7f615aea-330f-4c67-8101-0ae501c793cd",
        "labels": [
          {
            "group": "Pressure",
            "name": "No"
          },
          {
            "group": "Date",
            "name": "210522"
          }
        ]
      }
    ] 
    

    dplyr/tidyr

    library(dplyr)
    # library(tidyr) # pivot_longer, nest
    df %>%
      select(instanceNum, Pressure, Date) %>%
      tidyr::pivot_longer(-instanceNum, names_to = "group", values_to = "name") %>%
      tidyr::nest(labels = c("group", "name")) %>%
      full_join(df, ., by = "instanceNum") %>%
      select(-Pressure, -Date) %>%
      jsonlite::toJSON(., pretty = TRUE)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-22
      • 2016-05-09
      • 1970-01-01
      • 2017-07-12
      • 1970-01-01
      • 2016-07-27
      • 2015-02-02
      • 1970-01-01
      相关资源
      最近更新 更多