如何在保留键和值的 R 数据框中取消嵌套列表?

How do I unnest a list inside an R dataframe keeping both keys and values?

我目前正在努力将 JSON 格式的数据提取到 R 数据帧中。

提供的数据格式如下:

创建测试数据的示例代码:

test_input_data <- data.frame(date.x=c("2017-08-17", "2017-07-26", "2017-10-04"), properties.x=c("{\"gender\": \"Male\", \"nationality\": \"NZL\", \"document_type\": \"passport\", \"date_of_expiry\": \"2018-07-05\", \"issuing_country\": \"NZL\"}", "{\"gender\": \"Female\", \"nationality\": \"NLD\", \"document_type\": \"national_identity_card\", \"date_of_expiry\": \"2026-10-07\", \"issuing_country\": \"NLD\"}" , "{\"issuing_date\": \"2015-05-18\", \"document_type\": \"driving_licence\", \"date_of_expiry\": \"2017-05-05\", \"issuing_country\": \"IRL\"}"), stringsAsFactors = FALSE)

我想做的是创建一个数据框如下:

我目前正在使用 RJSONIO::fromJSON() 函数将 properties.x 映射到列表中,然后取消嵌套:

properties_doc_reports <- test_data %>% 
  mutate(properties.x = map(properties.x, ~ RJSONIO::fromJSON(.))) %>% 
  dplyr::filter(purrr::map_lgl(properties.x, ~!rlang::is_empty(.x))) %>% ##this is optional as it deletes all rows with empty lists
  as_tibble %>% 
  unnest(properties.x)

但是,这摆脱了 properties.x 中的 'key',这也是我所需要的。作为参考,R 代码的输出为我提供了以下内容:

但是,输入数据中的每一行都没有一组一致的键值对,因此我无法从行号推断出键。例如,输入数据帧

的第 3) 行缺少 'gender'

有什么想法吗?

您好,这是一个快速解决方案。我使用的事实是每个 json 只包含一行。 map_df 来自包 purrr 然后自动将所有行转换为单个 data.frame。由于 map_df 保持行顺序,所以它只是将生成的 df 与日期列绑定。

test_input_data <- data.frame(date.x=c("2017-08-17", "2017-07-26", "2017-10-04"), properties.x=c("{\"gender\": \"Male\", \"nationality\": \"NZL\", \"document_type\": \"passport\", \"date_of_expiry\": \"2018-07-05\", \"issuing_country\": \"NZL\"}", "{\"gender\": \"Female\", \"nationality\": \"NLD\", \"document_type\": \"national_identity_card\", \"date_of_expiry\": \"2026-10-07\", \"issuing_country\": \"NLD\"}" , "{\"issuing_date\": \"2015-05-18\", \"document_type\": \"driving_licence\", \"date_of_expiry\": \"2017-05-05\", \"issuing_country\": \"IRL\"}"), stringsAsFactors = FALSE)

library(tidyverse)
df <- bind_cols(
  test_input_data %>% 
    select(date.x),
  test_input_data$properties.x %>% 
    map_df(jsonlite::fromJSON)
)

希望对您有所帮助!!