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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 00:24:58