R语言批量展开含JSON列的DataFrame时类型冲突报错求助
解决JSON字段类型不兼容导致的DataFrame展开错误
解析JSON时直接统一目标字段类型
不要等解析完成后再处理类型,在解析JSON的环节就把response$response$free_text$text强制转为字符型,避免后续合并时类型冲突:library(dplyr) library(jsonlite) library(purrr) df <- df %>% mutate(response = map(response, function(json_str) { parsed_json <- fromJSON(json_str, flatten = FALSE) # 精准定位到目标字段转类型 parsed_json$response$free_text$text <- as.character(parsed_json$response$free_text$text) parsed_json })) %>% # 执行你的展开逻辑(比如unnest或col_to_long) unnest(response)也可以用
modify_depth简化嵌套层级的修改:df <- df %>% mutate(response = map(response, ~ fromJSON(.x) %>% modify_depth(3, ~ if (names(.x) == "text") as.character(.x) else .x))) %>% col_to_long(...)调整
mutate_all(as.character)的执行时机
之前的mutate_all无效,大概率是因为你在未解析JSON的原始字符串列上执行的——此时response是JSON字符串,转字符型毫无意义。必须在JSON解析完成、嵌套结构展开后,针对具体的text字段执行类型转换,或者在解析过程中处理。兜底:展开后强制统一类型
如果解析阶段的处理没覆盖到,可以在调用col_to_long()前,先把目标列强制转为字符型:df <- df %>% mutate(response = map(response, fromJSON)) %>% # 先提取目标字段转类型 mutate(text_field = map_chr(response, ~ as.character(.x$response$free_text$text))) %>% # 再执行你的展开操作 col_to_long(...)或者用
across批量处理所有混合类型列:df <- df %>% # 展开操作 col_to_long(...) %>% mutate(across(where(~ inherits(.x, c("integer", "character"))), as.character))排查JSON结构的一致性
两行数据的JSON结构可能存在差异(比如一行的free_text是单个值,另一行是数组),这也会导致类型合并错误。可以先打印每行解析后的结构确认:df %>% rowwise() %>% mutate(json_structure = list(str(fromJSON(response)))) %>% pull(json_structure)
内容的提问来源于stack exchange,提问作者Unai Vicente
相关产品推荐
相关产品推荐

