2017-10-10 19 views
1

TSV列からJSONを抽出しようとしています。難しいのは、JSONが浅くネストされていて、キー値がすべての行に存在しないことです。キーを知らずにRデータフレームからネストされたJSONを抽出する

私は、私の要点を説明するための最小限の例があります。

df <- tibble(index = c(1, 2), 
    data = c('{"json_char":"alpha", "json_list1":["x","y"]}', 
     '{"json_char":"beta", "json_list1":["x","y","z"], "json_list2":["a","b","c"]}')) 

望ましい結果:私は次のエラーを与える

extract_json_column <- function(df) { 
    df %>% 
    magrittr::use_series(data) %>% 
    purrr::map(jsonlite::fromJSON) %>% 
    purrr::map(purrr::simplify) %>% 
    tibble::enframe() %>% 
    tidyr::spread("name", "value") %>% 
    purrr::flatten_dfr() 
} 

Error in bind_rows_(x, .id) : Argument 2 must be length 3, not 7実験のかなりの量の後

df <- tibble::tibble(index = list(1, 2), 
     json_char = list("alpha", "beta"), 
     json_list1 = list(list("x","y"), list("x","y","z")), 
     json_list2 = list(NA, list("a","b","c"))) 

は、私はこの機能を持っています。

最初の行は、残りのデータフレームのパラメータ数を設定します。その行動を避けるためにとにかくありますか?

答えて

0

私はあなたの機能を次のように変更しました。私はこれが役立つことを願っています

library(tidyverse) 
library(rjson) 

extract_json_column <- function(df){ 
    df %>% 
    rowwise() %>% 
    mutate(data = map(data, fromJSON)) %>% 
    split(.$index) %>% 
    map(~.$data[[1]]) %>% 
    map(~map_if(., function(x) length(x) != 1, list)) %>% 
    map(as_data_frame) %>% 
    bind_rows(.id = "index") 
} 

extract_json_column(df) 
# A tibble: 2 x 4 
    index json_char json_list1 json_list2 
    <chr>  <chr>  <list>  <list> 
1  1  alpha <chr [2]>  <NULL> 
2  2  beta <chr [3]> <chr [3]> 
関連する問題