如何在保留键和值的 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)
)
希望对您有所帮助!!
我目前正在努力将 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)
)
希望对您有所帮助!!