从,使用R的API提取数据

问题描述 投票:1回答:1

我有机会获得一些遥测数据在蔚蓝的(特别是所有的API调用使用移动应用程序的客户)。我已经使用R中的HTTR包在3分钟的时间内,以请求的数据,并评估像这样(显然具有我没有包括下面我自己的应用ID和密钥)的响应:

install.packages("httr")
library(httr)

r1 <- GET("https://api.applicationinsights.io/v1/apps/application-ID/query?timespan=PT0.05H&query=requests", add_headers("X-Api-Key" = "my-unique-key"))

r1

####### response object ########
# Response [https://api.applicationinsights.io/v1/apps/application-ID/query?timespan=PT0.05H&query=requests]
# Date: 2018-01-11 15:55
# Status: 200
# Content-Type: application/json; charset=utf-8
# Size: 84.7 kB

在环境中的窗口,我可以看到R1为10的列表,并有84652个原始值:

enter image description here

我还可以使用内容的功能,看我有1列表:

r2 <- content(r1)

enter image description here

我有两个问题,真正做到:

1)如何使环境中的窗口,这些输出的意义吗?他们是怎么告诉我我的数据结构(我认为这是JSON根据内容类型描述)

2)有没有一种方法来检索数据,并把它成表格格式(数据帧)?我不知道如何来查询数据。我读了这篇文章,但不能将其应用到我的数据:https://tclavelle.github.io/blog/r_and_apis/

任何帮助,将不胜感激。


UPDATE 19/01/18

我用jalind的建议。参阅下面的代码和输出:

library(httr)
library(jsonlite)

r1 <- GET("https://api.applicationinsights.io/v1/apps/application-ID/query?timespan=PT0.05H&query=requests", add_headers("X-Api-Key" = "my-unique-key"))

#convert to a character string
r2 <- rawtoChar(r1$content)  

#check the class is character
class(r2)    

# now extract JSON from string object
r3 <- fromJSON(r2)

# convert to a data frame - this returns a data frame with columns called name, columns and rows 
x <- as.data.frame(r3[[1]])  

# column headings data frame (there are 37 columns - see example of first 3 columns below):               
c <- as.data.frame(x$columns)

#                       name      type
#                  timestamp    datetime
#                         id     string
#                     source     string

# data frame with 37 columns and all rows of telemetry data (only showing first 4 columns of this data frame):

r <- as.data.frame(x$rows)
#           X1                               X2                X3                  X4
# 1   2018-01-19T10:29:25.4Z       |aticCNxxxx=.f83assss_     <NA>          GET /Cards/Cardtype1
# 2   2018-01-19T10:29:30.226Z     |tX6Xz0xxxxx=.27cxcxae_    <NA>          GET /AddressLookup/Address
# 3   2018-01-19T10:29:45.327Z     |OgfPbicLues=.f83a9a1f_    <NA>          POST /Account/MobileDevice
# 4   2018-01-19T10:29:46.078Z     |V5MwpXXxxxxx=.f83axxxx_   <NA>          GET /Cards/Cardtype1
# 5   2018-01-19T10:30:00.427Z     |Jok8wxxxxxx=.7be33aaa_    <NA>          GET /cards/Cardtype1
json r azure httr
1个回答
0
投票

p0bs是正确的 - 你应该看看jsonlite包。

我不知道如果我能完全帮助你与你的问题的第一部分,但我也许能帮助你得到JSON到数据帧。

当您将GET功能的URL返回的原始内容是十六进制。

raw.result <- GET(url = url, path = path)
head(raw.result$content) ## This is in hex

十六进制是困难的工作,所以有一两件事你可以做的是内容转换为字符串。你可以用rawToChar功能做到这一点。

text.raw.content <- rawToChar(raw.result$content)
class(text.raw.content) ## Now its a string
nchar(text.raw.content) ## How many chars?

确定 - 现在你有一个字符串...比六角更好......但仍然不是你所期待的。但是你可以使用fromJSON功能在jsonlite包从字符串对象中提取的JSON。

json.content <- fromJSON(text.raw.content)
class(json.content) ## It's a list
length(json.content) ## With two elements
names(json.content) ## meta and data... makes sense...
class(json.content[[2]]) ## data.frame

因此,基本上,该列表的第二个元素是转换为原生的R数据帧中的内容JSON。根据我的经验有相当多你得到后这么远......但希望这可以让你开始时必须发生的多一点改写(munging)。

© www.soinside.com 2019 - 2024. All rights reserved.