使用正确的列名将JSON转换为数据框

时间:2018-12-01 17:57:54

标签: r json jsonlite

我正在尝试将下面的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)填写以下栏:部门,课程名称,讲师,教官性别?

1 个答案:

答案 0 :(得分:1)

我认为您需要发布更多数据,但是:

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

如果您陷在整洁中:

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
相关问题