在DataFrame中展开向量时出现类型不兼容错误
PRIDE数据库数据展开报错问题解决
问题描述
尝试从PRIDE数据库下载挪威提交的数据集,展开fields.species列的多元素向量用于ggplot绘图,使用jsonlite和tidyverse编写代码,但执行unnest时出现类型不兼容的错误。
原代码
library(jsonlite) library(tidyverse) query = "https://www.ebi.ac.uk/ebisearch/ws/rest/pride?query=submitter_country:Norway&size=1000&fields=species&format=json" datasets.raw <- fromJSON(query, flatten = TRUE, simplifyDataFrame = TRUE) datasets.df <- do.call(rbind, datasets.raw) #转换为dataframe unpack <- datasets.df %>% select(id, fields.species) %>% unnest(fields.species)
报错信息
Error in
col_to_long(): ! Can't combine..1$fields.speciesinteger and..3$fields.speciescharacter. Runrlang::last_trace()to see where the error occurred.
unpack <- datasets.df %>% select(id, fields.species) %>% unnest(fields.species) Error inlist_unchop(): ! Can't combinex[[1]]integer andx[[2]]character. Runrlang::last_trace()to see where the error occurred.
问题原因
- 数据提取错误:
fromJSON返回的datasets.raw是包含hitCount、entries等多个元素的列表,直接用do.call(rbind, datasets.raw)会错误合并所有顶层元素,导致datasets.df结构混乱,混入非数据集条目内容。 - 类型混杂:
fields.species列的元素类型不一致,部分是整数(物种ID),部分是字符(物种名称),unnest无法处理混合类型的列表列。
解决代码
library(jsonlite) library(tidyverse) query = "https://www.ebi.ac.uk/ebisearch/ws/rest/pride?query=submitter_country:Norway&size=1000&fields=species&format=json" # 正确提取数据集条目entries部分 datasets.raw <- fromJSON(query, flatten = TRUE, simplifyDataFrame = TRUE) datasets.df <- datasets.raw$entries # 统一fields.species的类型为字符后再展开 unpack <- datasets.df %>% select(id, fields.species) %>% mutate(fields.species = map(fields.species, as.character)) %>% unnest(fields.species)
说明
- 提取
datasets.raw$entries才是真正的数据集列表,避免混入hitCount等无关数据。 map(fields.species, as.character)将所有物种条目转成字符类型,消除类型差异,确保unnest能正常执行。
内容的提问来源于stack exchange,提问作者Illimar Rekand
相关产品推荐
相关产品推荐

