使用嵌入 data.frames 的列表列:
dat <- read.table(header=TRUE, stringsAsFactors=FALSE, text="
user_id email segment name
123 a@gmail.com new a
234 b@gmail.com old b")
dat$custom_data <- lapply(dat$segment, function(a) data.frame(segment = a))
dat$tags <- lapply(dat$name, function(a) data.frame(name = a))
dat$segment <- dat$name <- NULL
jsonlite::toJSON(dat, pretty = TRUE)
# [
# {
# "user_id": 123,
# "email": "a@gmail.com",
# "custom_data": [
# {
# "segment": "new"
# }
# ],
# "tags": [
# {
# "name": "a"
# }
# ]
# },
# {
# "user_id": 234,
# "email": "b@gmail.com",
# "custom_data": [
# {
# "segment": "old"
# }
# ],
# "tags": [
# {
# "name": "b"
# }
# ]
# }
# ]
一个不同之处在于,在您的中,"custom_data" 只是一个字典/哈希,而 jsonlite 将该字典放在一个列表中(长度为 1)。
如果你是一个 tidyverse-junkie(不是那么糟糕):
library(dplyr)
dat %>%
mutate(
custom_data = purrr::map(segment, ~ tibble(segment = .x)),
tags = purrr::map(name, ~ tibble(name = .x))
) %>%
select(-segment, -name) %>%
jsonlite::toJSON(., pretty = TRUE)
如果你更喜欢data.table,那么
library(data.table)
as.data.table(dat)[
][, c("custom_data", "tags") :=
.(lapply(dat$segment, function(a) data.frame(segment = a)),
lapply(dat$name, function(a) data.frame(name = a)))
][, c("segment", "name") := NULL
][, jsonlite::toJSON(.SD, pretty = TRUE) ]
或者如果你仍然喜欢magrittr 的“管道”流,
library(magrittr)
as.data.table(dat) %>%
.[, c("custom_data", "tags") :=
.(lapply(dat$segment, function(a) data.frame(segment = a)),
lapply(dat$name, function(a) data.frame(name = a))) ] %>%
.[, c("segment", "name") := NULL ] %>%
jsonlite::toJSON(., pretty = TRUE)