1

我正在从 PowerBI REST API 解析数据以获取活动数据。这个 API 函数的方式是——同一个端点今天可能返回 10 个字段的数据,明天它可能返回 15 个字段。我的目标是运行一个计划的过程,该过程将提取每日数据(比如放入 SQL 表中)。我用我需要的列预定义了一个输出数据框。但是我正在寻找一种方法来处理这种情况 - 比如说我在输出数据框中定义了 12 列,并且在今天的 REST API 提取中,结果不包含这 12 列中的 1 列。我想将它们作为 NA (或空字符串)。如何在 R 中做到这一点?下面是我正在使用的代码块:

response<-httr::GET(url=RESTEndPoint,config=httpHeader)
parsedResp<-httr::content(response, "text",encoding = "UTF- 
8")%>%jsonlite::fromJSON(flatten = TRUE)
  
df<-as.data.frame(parsedResp$activityEventEntities)
outputDF<-df %>%
  dplyr::select(
    LogID='Id'
    ,CreationTimeD='CreationTime'
    ,Operation='Operation'
    ,OrganizationID='OrganizationId'
    
  )

假设解析的响应中缺少“操作”字段,那么这将引发错误:“错误:不能对不存在的列进行子集化。” 因为这就是 dplyr:Select 的工作原理。有没有办法说,当解析的响应中缺少“操作”字段时,将其分配为 NA 并继续循环的下一次迭代

谢谢!

4

1 回答 1

0

在没有看到数据的情况下不确定这是否是您问题的解决方案。Delivery_是交货的例子。您还可以创建一个空数据框,其中包含所需的列,称为“data_delivery_cools_needed”,稍后将其删除。

library(data.table)
library(tidyverse)

coos_needed <- c('a', 'b', 'c')

delivery_1 <- data.frame(a = 1, b = 2, x = 3, z = 4)
delivery_2 <- data.frame(c = 1)
delivery_3 <- data.frame(a = 1, b = 2, c = 3)
delivery_4 <- data.frame(f = 5)

# Create a list of all deliveries

all_deliveries <- mget(ls(pattern = "^delivery_"))

# Combine everything into one - fill = TRUE

all_deliveries_data_frame <- rbindlist(all_deliveries, fill = TRUE, idcol = "delivery_file")

final_data <- all_deliveries_data_frame %>% select(cols_needed)
于 2020-12-30T09:02:03.680 回答