You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 06:02:39