【问题标题】:R - Merge all JSONs in a fileR - 将所有 JSON 合并到一个文件中
【发布时间】:2021-04-23 10:52:45
【问题描述】:

我想将一个文件夹中的所有文件合并到一个 DataFrame 中。所有文件的结构都相同。一个例子:

{"title": "Olijvenpest duikt op", "source": "De Standaard", "source_page": "18", "date": "2018-10-16", "body": "In een tuincentrum in Roeselare werd eind september op olijfbomen voor het eerst een dodelijke bacterie gevonden"}

R 可以看到所有文件,代码如下:

library(jsonlite)
path <- "..."
files <- dir(path, pattern = "*",full.names = TRUE)

但是,我无法合并所有文件。我尝试了很多关于 stackoverflow 的选项,但它们总是会导致错误。

每个 json 都应该是一个具有不同变量的观察:标题、来源、日期...

亲切的问候 史蒂文

【问题讨论】:

    标签: r json dataframe merge


    【解决方案1】:

    将所有这些文件导入向量中:

    x <- character(length(files))
    for(i in seq_along(files)){
      x[i] <- readLines(files[i])
    }
    

    创建数据框的 JSON 表示:

    json <- paste0("[", paste0(x, collapse = ","), "]")
    

    现在使用“jsonlite”:fromJSON(json)

    【讨论】:

    • 在尝试您的第一个代码后出现以下错误:“x[i]
    • @StevenUA 也许这个错误是由于一个空文件。对于警告,我的猜测是文件不止一行。
    【解决方案2】:

    首先,您使用

    读取 JSON 文件
    files <- dir(pattern = "*.json", full.names = TRUE)
    JSON <- lapply(files, function(z) rjson::fromJSON(file = z))
    

    请注意,您需要将 .json 文件放在适当的文件夹中,这样才能在该文件夹也是您当前的工作目录的情况下工作。

    然后你像这样在 tidyverse 的 dplyr 的帮助下转换你读入的文件

    JSON_New <- lapply(JSON, function(x) {cols <- names(x); x %>% 
      unique %>% 
      unlist %>% 
      as.data.frame %>% 
      tibble::rownames_to_column("Content") %>% 
      mutate(Category = names(x)) %>%  
      select(3, 2)})
    

    这样您就会收到一个 data.frames 列表,您现在可以根据您的文件名重命名它们

    names(myJSON_New) <- files
    

    例如,如果我两次使用您给定的示例文件,那么在按照我之前描述的步骤进行操作后,我将得到以下输出。

    [[1]]
         Category                                                                                                                .
    1       title                                                                                             Olijvenpest duikt op
    2      source                                                                                                     De Standaard
    3 source_page                                                                                                               18
    4        date                                                                                                       2018-10-16
    5        body In een tuincentrum in Roeselare werd eind september op olijfbomen voor het eerst een dodelijke bacterie gevonden
    
    [[2]]
         Category                                                                                                                .
    1       title                                                                                             Olijvenpest duikt op
    2      source                                                                                                     De Standaard
    3 source_page                                                                                                               18
    4        date                                                                                                       2018-10-16
    5        body In een tuincentrum in Roeselare werd eind september op olijfbomen voor het eerst een dodelijke bacterie gevonden
    

    然后,要组合 data.frames 列表,使一个 json 是一行,您可以这样做

    > A <- JSON_New %>% reduce(inner_join, by = "Category") %>% data.table::transpose(.)
                        V1           V2          V3         V4                                                                                                               V5
    1                title       source source_page       date                                                                                                             body
    2 Olijvenpest duikt op De Standaard          18 2018-10-16 In een tuincentrum in Roeselare werd eind september op olijfbomen voor het eerst een dodelijke bacterie gevonden
    3 Olijvenpest duikt op De Standaard          18 2018-10-16 In een tuincentrum in Roeselare werd eind september op olijfbomen voor het eerst een dodelijke bacterie gevonden
    

    【讨论】:

      猜你喜欢
      • 2016-09-05
      • 1970-01-01
      • 2013-06-03
      • 2022-06-17
      • 2019-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多