Radlibrary for Facebook Ads的as_tibble函数报错:.data中未找到percentage列
根因说明
这个报错是Facebook Ads Library API 2024年中字段调整导致的,原人口统计/区域维度返回的percentage字段已更名为reach_percentage,而Radlibrary包已有超过1年未发布更新,未适配该字段变动,和dplyr版本无关。广告维度接口没有涉及该字段,所以可以正常转换。
你可以先运行以下代码验证返回字段:
# 查看第一条返回广告的人口统计数据字段名 names(result_dem$responses[[1]]$data[[1]]$demographic_data[[1]])
如果返回结果包含reach_percentage而无percentage,即可确认根因。
解决方案1:临时覆写包的转换方法
直接在当前会话中重写paginated_adlib_data_response类的as_tibble方法,适配新字段:
library(tidyverse) library(Radlibrary) as_tibble.paginated_adlib_data_response <- function(x, type = c("ad", "demographic", "region"), ...) { type <- match.arg(type) # 广告维度沿用原有逻辑 if (type == "ad") return(Radlibrary:::as_tibble_ad(x)) # 人口/区域维度手动适配字段 data_key <- if (type == "demographic") "demographic_data" else "region_data" map_dfr(x$responses, function(resp) { map_dfr(resp$data, function(ad) { if (is.null(ad[[data_key]])) return(tibble()) bind_rows(ad[[data_key]]) %>% mutate( ad_id = ad$id, # 用API实际返回的百分比字段替换原percentage percentage = reach_percentage ) }) }) }
覆写完成后直接运行你原来的转换代码即可正常生成tibble。
解决方案2:手动提取原始数据(更稳定)
如果不想修改包的方法,也可以直接从返回对象的原始列表结构里逐层提取数据,完全不依赖包自带的转换函数:
tibble_dem <- map_dfr(result_dem$responses, function(page) { map_dfr(page$data, function(ad) { # 跳过无人口统计数据的广告 if (length(ad$demographic_data) == 0) return(NULL) # 自定义提取所需字段 bind_rows(ad$demographic_data) %>% mutate( ad_id = ad$id, ad_create_time = ad$ad_creation_time, ad_creative_body = ad$ad_creative_bodies[[1]] ) }) })
该方法不受包更新限制,后续API再有字段变动时也可以灵活调整提取逻辑。
内容的提问来源于stack exchange,提问作者Mads F. Hove
相关产品推荐
相关产品推荐

