微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

R/PowerBI API 问题:当源数据帧的结构不一致时,如何为结果数据帧中缺失的列分配 NA

如何解决R/PowerBI API 问题:当源数据帧的结构不一致时,如何为结果数据帧中缺失的列分配 NA

我正在解析来自 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 并继续循环的下一次迭代

谢谢!

解决方法

在没有看到数据的情况下不确定这是否可以解决您的问题。 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,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)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。