将 R 数据框转换为自定义 json
Convert R data frame to custom json
我想在最后将数据框更改为自定义 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
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)
我想在最后将数据框更改为自定义 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
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)