将 R 数据框转换为自定义 json

问题描述

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

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

    df<-setNames(
  data.frame(
    t(data.frame(c("",1,2,20,"2b9c5fb7-72a4-4482-baa1-34cc37522d24","Yes","210521"),c("",3,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",{
                                "name": "210522","instanceNum": 2,"modifyCount": 3,"startTime": 20,"endTime": 40,"uniqueId": "7f615aea-330f-4c67-8101-0ae501c793cd"
                    }

解决方法

试试这些选项:

基础 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,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","modifyCount": "3","startTime": "20","endTime": "40","uniqueId": "7f615aea-330f-4c67-8101-0ae501c793cd","name": "No"
      },"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)