簡體   English   中英

從 R 中的 dataframe 列中提取具有不對稱內容的 JSON 數據

[英]Extracting JSON data with asymetric content from a dataframe column in R

我從數據庫中加載了一個表,該表包含一列,每一行都有 JSON 數據。 該表類似於下面的示例。 (由於列數據的格式,我無法復制我擁有的 data.frame)

dataframe_example <- data.frame(id = c(1,2,3),
                                name = c("name1","name2","name3"),
                                JSON_col = c({"_inv": [10,20,30,40]}, "_person": ["_personid": "green"],
                                             {"_inv": [15,22]}, "_person": ["_personid": "blue"],
                                             {"_inv": []}, "_person": ["_personid": "red"]))

我有以下兩個問題: 某些項目(例如“_inv”)有時有完整的 4 個數字條目,有時更少,有時什么也沒有。 其他一些項目(例如“_person”)通常包含另一個 header,但只有一個字符數據點。

我的目標是保留現有的數據框列(例如 id 和名稱)並將數據分布在 json 列中,這樣我就有了包含每個信息點的新列。 目標 dataframe 看起來有點像這樣:

data.frame(id = c(1,2,3),
           name = c("name1","name2","name3"),
           `_inv_1` = c(10,15,NA),
           `_inv_2` = c(20,22,NA),
           `_inv_3` = c(30,NA,NA),
           `_inv_4` = c(40,NA,NA),
           `_person_id` = c("green","blue","red"))

請記住,我處理 JSON 數據的經驗很少,也沒有處理不均勻的 JSON 數據的經驗。

使用purrr我得到了:

frame <- purrr::map(dataframe_example$JSON_col, jsonlite::fromJSON)

這給了我一個包含 n 個元素的大列表,其中 n 是原始 dataframe 的長度。 “名稱”項包含 n 個列表 [[1]],每個列表都有自己的 object 類型,范圍從 double 到 data.frame。 雙 object 包含四個數值觀察,(例如_inv),一些對象本身是列表(例如_person),其中進一步包含“_personid”,然后是單個條目。 dataframe 包含 JSON 數據中每個觀察的日期時間戳。 (每個 _inv 項目都有一個時間戳)

有沒有辦法通過從我的“框架”object 中提取數據或完全不同的解決方案來獲得上述解決方案?

library(tidyverse)
library(jsonlite)
#> 
#> Attaching package: 'jsonlite'
#> The following object is masked from 'package:purrr':
#> 
#>     flatten

dataframe_example <-
  data.frame(
    id = c(1, 2, 3),
    name = c("name1", "name2", "name3"),
    JSON_col = c(
      "{\"_inv\": [10,20,30,40], \"_person\": {\"_personid\": \"green\"}}",
      "{\"_inv\": [15,22], \"_person\": {\"_personid\": \"blue\"}}",
      "{\"_inv\": [], \"_person\": {\"_personid\": \"red\"}}"
    )
  )

dataframe_example %>%
  as_tibble() %>%
  mutate(
    JSON_col = JSON_col %>% map(parse_json)
  ) %>%
  unnest_wider(JSON_col) %>%
  unnest(`_inv`) %>%
  unnest(`_inv`) %>%
  unnest(`_person`) %>%
  unnest(`_person`) %>%
  group_by(id, name) %>%
  mutate(inv_id = row_number()) %>%
  pivot_wider(names_from = inv_id, values_from = `_inv`, names_prefix = "_inv_")
#> # A tibble: 2 x 7
#> # Groups:   id, name [2]
#>      id name  `_person` `_inv_1` `_inv_2` `_inv_3` `_inv_4`
#>   <dbl> <chr> <chr>        <int>    <int>    <int>    <int>
#> 1     1 name1 green           10       20       30       40
#> 2     2 name2 blue            15       22       NA       NA

代表 package (v2.0.1) 於 2021 年 11 月 25 日創建

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM