问题描述
我想最后将数据框更改为自定义 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)