R 从 DF 创建 JSON 列表

  • 本文关键字:JSON 列表 创建 DF r json
  • 更新时间 :
  • 英文 :


我有一个数据帧,如下所示:

rnum  Field  Value  
1        Car   25.2
1        Bike 20.1
1        Taxi  100.1
2        Car   25.5   
2        Bike  19.1
2        Taxi  25.7

我想创建一个JSON列表,这样列表中的每个元素都是一个JSON对象,并按rnum分组。从本质上讲,列表中的一个元素应该是这样的:

{"Car":25.2,"Bike":20.1,"Taxi":100.1,"rnum":"1"}

我尝试了df %>%group_by(rnum)%>%toJSON(),但它为每行生成3个JSON条目。谢谢

在使用"rnum"的group_split之后,使用maplist上循环,创建一个命名的list,应用toJSON并将其展平为单个character矢量

library(dplyr)
library(purrr)
library(jsonlite)
library(tibble)
out <- df1 %>%
group_split(rnum, .keep = FALSE) %>% 
map_chr( ~ toJSON(as.list(deframe(.x)), auto_unbox = TRUE))

-输出

cat(out, 'n')
#{"Car":25.2,"Bike":20.1,"Taxi":100.1} {"Car":25.5,"Bike":19.1,"Taxi":25.7} 

或使用base R中的xtabs

toJSON(as.data.frame.matrix(xtabs(Value ~ rnum + Field, df1)))
#[{"Bike":20.1,"Car":25.2,"Taxi":100.1},{"Bike":19.1,"Car":25.5,"Taxi":25.7}] 

或使用data.table

library(data.table)
toJSON(dcast(setDT(df1), rnum ~ Field))

数据

df1 <- structure(list(rnum = c(1L, 1L, 1L, 2L, 2L, 2L), Field = c("Car", 
"Bike", "Taxi", "Car", "Bike", "Taxi"), Value = c(25.2, 20.1, 
100.1, 25.5, 19.1, 25.7)), class = "data.frame", row.names = c(NA, 
-6L))

首先加宽:

df %>%
tidyr::pivot_wider(rnum, names_from="Field", values_from="Value") %>%
jsonlite::toJSON()
# [{"rnum":1,"Car":25.2,"Bike":20.1,"Taxi":100.1},{"rnum":2,"Car":25.5,"Bike":19.1,"Taxi":25.7}] 

这里是另一个使用reshape的基本R选项,例如

gsub(
"Value\.",
"",
toJSON(reshape(df, direction = "wide", idvar = "rnum", timevar = "Field"))
)

它给出

[{"rnum":1,"Car":25.2,"Bike":20.1,"Taxi":100.1},{"rnum":2,"Car":25.5,"Bike":19.1,"Taxi":25.7}] 

最新更新