使用jsonlite扩展JSON列时遇unnest方法不适用于list的错误
解决JSON列扩展为多列时的
unnest错误 原始数据与尝试代码
用户创建的数据框:
accessed = c("{\"first\":\"2024-01-25T15:02:02\",\"last\":\"2024-01-25T15:20:08\"}","{\"first\":\"2023-11-09T08:07:11\",\"last\":\"2023-11-09T08:32:18\"}","{\"first\":\"2023-11-09T08:33:39\",\"last\":\"2023-11-10T16:03:38\"}") col1 = c("a","b","c") col2 = c("a","b","c") df = data.frame(accessed, col1,col2)
尝试的处理代码:
dfnew = df|> mutate(accessed = map(accessed, ~ jsonlite::fromJSON(.x) |> unnest(everything())))
触发的错误:
Error in `mutate()`: ℹ In argument: `accessed = map(accessed, ~unnest(jsonlite::fromJSON(.x), everything()))`. Caused by error in `map()`: ℹ In index: 1. Caused by error in `UseMethod()`: ! no applicable method for 'unnest' applied to an object of class "list" Run `rlang::last_trace()` to see where the error occurred.
错误原因
jsonlite::fromJSON()解析单条JSON字符串后返回的是普通列表,而unnest()是tidyr包中用于处理数据框(或嵌套数据框列)的函数,它无法直接作用于普通列表,这就是报错的核心原因。
解决方案
提供两种简洁有效的处理方式:
方法1:用map_dfr解析合并后拼接原数据
先将JSON列解析为独立数据框,再与原数据的其他列拼接:
library(purrr) library(jsonlite) library(dplyr) # 解析JSON列并转为数据框 accessed_df <- map_dfr(df$accessed, jsonlite::fromJSON) # 合并原数据与解析后的列 dfnew <- bind_cols(df %>% select(-accessed), accessed_df)
方法2:map解析后用unnest_wider展开列表列
先通过map把每个JSON字符串解析为列表,再用unnest_wider将列表列展开为多列:
library(purrr) library(jsonlite) library(dplyr) library(tidyr) dfnew <- df %>% mutate(accessed = map(accessed, jsonlite::fromJSON)) %>% unnest_wider(accessed)
两种方法最终都能得到包含col1、col2、first、last四列的数据框,实现JSON列扩展为多列的需求。
内容的提问来源于stack exchange,提问作者Unai Vicente
相关产品推荐
相关产品推荐

