使用 R 从 API 中提取数据
Extracting data from an API using R
我可以在 Azure 中访问一些遥测数据(特别是所有 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
在环境 window 中,我可以看到 r1 是一个 10 的列表,并且有 84,652 个原始值:
我也可以使用内容函数来查看我有一个列表 1:
r2 <- content(r1)
我真的有两个问题:
1) 我如何理解环境 window 中的这些输出?他们告诉我关于我的数据结构的什么信息(我认为它是 JSON 基于内容类型描述)
2) 有没有办法检索数据并将其转换为表格格式(数据框)?我不明白如何查询数据。我阅读了这篇文章,但无法将其应用于我的数据:https://tclavelle.github.io/blog/r_and_apis/
如有任何帮助,我们将不胜感激。
更新 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
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?
好的 - 现在您有了一个字符串...比十六进制更好...但仍然不是您要找的东西。但是你可以使用 jsonlite 包中的 fromJSON 函数从字符串对象中提取 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
因此,基本上,此列表的第二个元素是 JSON 转换为原生 R 数据框的内容。根据我的经验,在你走到这一步之后必须进行更多的修改……但希望这能让你开始。
我可以在 Azure 中访问一些遥测数据(特别是所有 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
在环境 window 中,我可以看到 r1 是一个 10 的列表,并且有 84,652 个原始值:
我也可以使用内容函数来查看我有一个列表 1:
r2 <- content(r1)
我真的有两个问题:
1) 我如何理解环境 window 中的这些输出?他们告诉我关于我的数据结构的什么信息(我认为它是 JSON 基于内容类型描述)
2) 有没有办法检索数据并将其转换为表格格式(数据框)?我不明白如何查询数据。我阅读了这篇文章,但无法将其应用于我的数据:https://tclavelle.github.io/blog/r_and_apis/
如有任何帮助,我们将不胜感激。
更新 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
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?
好的 - 现在您有了一个字符串...比十六进制更好...但仍然不是您要找的东西。但是你可以使用 jsonlite 包中的 fromJSON 函数从字符串对象中提取 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
因此,基本上,此列表的第二个元素是 JSON 转换为原生 R 数据框的内容。根据我的经验,在你走到这一步之后必须进行更多的修改……但希望这能让你开始。