将 JSON 转换为具有正确列名的数据框
Converting JSON to data frame with proper column names
我正在尝试将下面的 json 转换为数据框:
data_toy.json =
{
"department": {
"BME": [
{
"course_name": "BMD_ENG_250-0_20 Thermodynamics",
"instructor": "Neha Kamat",
"instructor_gender": "F"
}
]
}
}
然而,当我运行
library(jsonlite)
dat <- as.data.frame(fromJSON('data_toy.json'))
我得到:
> str(dat)
'data.frame': 1 obs. of 3 variables:
$ department.BME.course_name : chr "BMD_ENG_250-0_20 Thermodynamics"
$ department.BME.instructor : chr "Neha Kamat"
$ department.BME.instructor_gender: chr "F"
我如何:
1) 为 department
添加一列?
2) 创建栏目:部门,course_name,讲师,instructor_gender?
我认为您需要 post 更多数据,但是:
data_toy.json = '{"department": {"BME": [{"course_name": "BMD_ENG_250-0_20 Thermodynamics","instructor": "Neha Kamat","instructor_gender": "F"}]}}'
dat <- jsonlite::fromJSON(data_toy.json, simplifyVector = FALSE, simplifyDataFrame = FALSE, flatten=FALSE)
str(dat)
## List of 1
## $ department:List of 1
## ..$ BME:List of 1
## .. ..$ :List of 3
## .. .. ..$ course_name : chr "BMD_ENG_250-0_20 Thermodynamics"
## .. .. ..$ instructor : chr "Neha Kamat"
## .. .. ..$ instructor_gender: chr "F"
基数 R:
do.call(
rbind.data.frame,
unname(lapply(dat, function(x) {
tdf <- as.data.frame(x[[1]], stringsAsFactors=FALSE)
tdf$department <- names(x)[1]
tdf
}))
)
## course_name instructor instructor_gender department
## 1 BMD_ENG_250-0_20 Thermodynamics Neha Kamat F BME
如果你被困在 tidyverse 中:
library(purrr)
map_df(dat, ~{
flatten_df(.x[[1]]) %>%
dplyr::mutate(department = names(.x)[1])
})
## # A tibble: 1 x 4
## course_name instructor instructor_gender department
## <chr> <chr> <chr> <chr>
## 1 BMD_ENG_250-0_20 Thermodynamics Neha Kamat F BME
我正在尝试将下面的 json 转换为数据框:
data_toy.json =
{
"department": {
"BME": [
{
"course_name": "BMD_ENG_250-0_20 Thermodynamics",
"instructor": "Neha Kamat",
"instructor_gender": "F"
}
]
}
}
然而,当我运行
library(jsonlite)
dat <- as.data.frame(fromJSON('data_toy.json'))
我得到:
> str(dat)
'data.frame': 1 obs. of 3 variables:
$ department.BME.course_name : chr "BMD_ENG_250-0_20 Thermodynamics"
$ department.BME.instructor : chr "Neha Kamat"
$ department.BME.instructor_gender: chr "F"
我如何:
1) 为 department
添加一列?
2) 创建栏目:部门,course_name,讲师,instructor_gender?
我认为您需要 post 更多数据,但是:
data_toy.json = '{"department": {"BME": [{"course_name": "BMD_ENG_250-0_20 Thermodynamics","instructor": "Neha Kamat","instructor_gender": "F"}]}}'
dat <- jsonlite::fromJSON(data_toy.json, simplifyVector = FALSE, simplifyDataFrame = FALSE, flatten=FALSE)
str(dat)
## List of 1
## $ department:List of 1
## ..$ BME:List of 1
## .. ..$ :List of 3
## .. .. ..$ course_name : chr "BMD_ENG_250-0_20 Thermodynamics"
## .. .. ..$ instructor : chr "Neha Kamat"
## .. .. ..$ instructor_gender: chr "F"
基数 R:
do.call(
rbind.data.frame,
unname(lapply(dat, function(x) {
tdf <- as.data.frame(x[[1]], stringsAsFactors=FALSE)
tdf$department <- names(x)[1]
tdf
}))
)
## course_name instructor instructor_gender department
## 1 BMD_ENG_250-0_20 Thermodynamics Neha Kamat F BME
如果你被困在 tidyverse 中:
library(purrr)
map_df(dat, ~{
flatten_df(.x[[1]]) %>%
dplyr::mutate(department = names(.x)[1])
})
## # A tibble: 1 x 4
## course_name instructor instructor_gender department
## <chr> <chr> <chr> <chr>
## 1 BMD_ENG_250-0_20 Thermodynamics Neha Kamat F BME