我有一个数据帧,如下所示:
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
之后,使用map
在list
上循环,创建一个命名的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}]