如何用R的httr2包从费城公交API提取全部线路的完整数据?
解决费城公交API数据提取返回空tibble的问题
问题分析
你遇到的核心问题是:嵌套列表中存在空的线路/公交条目,直接用map_dfr批量处理时,空列表会被转成空tibble,最终合并后得到0行0列的结果。而单条单个公交能成功,说明单个条目转tibble的逻辑是成立的。
解决方案
以下是几种可行的处理方式,根据你的数据结构选择:
方法1:过滤空线路后嵌套合并
先剔除没有公交数据的线路,再逐层将公交条目转成tibble并合并,同时保留线路标识:
library(httr2) library(purrr) library(tibble) # 假设你已完成API调用与数据解析 resp <- request("https://api.phillytransit.com/TransitViewAll") %>% req_perform() %>% resp_body_json() routes <- pluck(resp, "routes") # 定位到128条线路的列表 # 过滤空线路 + 合并所有公交数据 all_bus_data <- routes %>% # 只保留有公交数据的线路 keep(~length(.x) > 0) %>% # 对每个线路,将其下的公交转成tibble,再合并所有线路的数据 map_dfr(~map_dfr(.x, as_tibble), .id = "route_id")
方法2:直接拉平所有公交条目
把所有线路下的公交条目拉平成一个大列表,过滤空条目后再转成tibble:
all_bus_data <- routes %>% # 拉平所有线路的公交列表,得到单个公交条目组成的大列表 flatten() %>% # 过滤掉空的公交条目(匹配你提到的19项数据长度) keep(~!is.null(.x) && length(.x) == 19) %>% # 转成合并后的tibble map_dfr(as_tibble)
方法3:用list_rbind合并层级数据
如果需要保留线路信息,也可以先将每个线路的公交转成tibble,再统一合并:
all_bus_data <- routes %>% # 每个线路生成一个包含该线路所有公交的tibble map(~map_dfr(.x, as_tibble)) %>% # 合并所有线路的tibble,添加线路ID列 list_rbind(.id = "route_number")
验证步骤
可以先检查各线路的公交数量,确认空条目情况:
# 统计每条线路的公交数量 route_bus_counts <- map_int(routes, length) # 查看数量分布 table(route_bus_counts)
如果输出中有大量0,说明大部分线路暂时没有公交数据,过滤后就能得到有效结果。
内容的提问来源于stack exchange,提问作者featherz_mcgraw
相关产品推荐
相关产品推荐

