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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 03:24:06