使用R调用Supabase API爬取SER-SID数据的遗留问题求助
解决SER-SID数据爬取的两个问题
问题1:种子重量(seed_weights)数据未返回
SER-SID的Supabase API默认不会返回所有字段,或者seed_weights存储在关联表中。你需要在API请求的select参数里明确指定要获取该字段,或者关联对应的表。
修正请求参数示例
假设你之前的API请求框架如下,修改select参数确保包含seed_weights:
library(httr) library(jsonlite) supabase_url <- "https://ser-sid.supabase.co/rest/v1/species" api_key <- "your-api-key" response <- GET( supabase_url, add_headers( "apikey" = api_key, "Authorization" = paste("Bearer", api_key) ), query = list( select = "*,seed_weights" # 明确指定获取seed_weights字段 ) ) raw_data <- fromJSON(content(response, "text"))
如果seed_weights在关联表(比如seed_traits)中,改用关联查询语法:
query = list( select = "*,seed_traits(seed_weights)" )
问题2:DataFrame包含列表类型变量
用tidyr::unnest()可以将列表列展开为常规列,或根据嵌套结构用purrr处理:
扁平化列表列示例
library(tidyr) library(dplyr) library(purrr) # 展开seed_weights列表(保留空值) flattened_data <- raw_data %>% unnest(cols = seed_weights, keep_empty = TRUE) # 若列表是嵌套JSON结构,先转成数据框再展开 flattened_data <- raw_data %>% mutate(seed_weights = map(seed_weights, as.data.frame)) %>% unnest(cols = seed_weights) # 若不需要展开,可将列表转为字符串 flattened_data <- raw_data %>% mutate(seed_weights_str = map_chr(seed_weights, ~ paste(.x, collapse = "; ")))
完整可运行代码
library(httr) library(jsonlite) library(dplyr) library(tidyr) supabase_url <- "https://ser-sid.supabase.co/rest/v1/species" api_key <- "your-api-key" # 请求包含seed_weights的完整数据 response <- GET( supabase_url, add_headers( "apikey" = api_key, "Authorization" = paste("Bearer", api_key) ), query = list( select = "*,seed_weights" ) ) # 解析并处理数据 final_data <- fromJSON(content(response, "text")) %>% unnest(cols = seed_weights, keep_empty = TRUE) %>% mutate(across(where(is.list), ~ map_chr(.x, ~ paste(.x, collapse = ", "))))
内容的提问来源于stack exchange,提问作者Derek Corcoran
相关产品推荐
相关产品推荐

