[英]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.