Извлечение данных из API с помощью R

У меня есть доступ к некоторым данным телеметрии в Azure (в частности, ко всем вызовам API для клиентов, использующих мобильное приложение). Я использовал пакет httr в R для запроса данных за 3-минутный период и оценки ответа следующим образом (очевидно, у меня есть собственный идентификатор приложения и ключ, которые я не указал ниже):

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 и 84 652 необработанных значения:

введите здесь описание изображения

Я также могу использовать функцию содержимого, чтобы увидеть, что у меня есть список из 1:

r2 <- content(r1)

введите здесь описание изображения

У меня два вопроса на самом деле:

1) Как понять эти выходные данные в окне среды? Что они говорят мне о структуре моих данных (думаю, это JSON на основе описания типа контента)

2) Есть ли способ получить данные и преобразовать их в табличный формат (фрейм данных)? Я не понимаю, как запросить данные. Я прочитал эту статью, но не смог применить ее к своим данным: https://tclavelle.github.io/blog/r_and_apis/

Любая помощь будет оценена по достоинству.


ОБНОВЛЕНИЕ 19 января 2018 г.

Я воспользовался предложением Джалинда. См. ниже код и выходные данные:

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

person JassiL    schedule 11.01.2018    source источник
comment
Без воспроизводимого примера будет очень сложно вам помочь . Мы понятия не имеем, что возвращает сервер или как именно вы ожидаете, что это будет помещено в таблицу.   -  person MrFlick    schedule 11.01.2018
comment
Я согласен с комментарием выше, но вы можете взглянуть на пакет jsonlite   -  person p0bs    schedule 11.01.2018
comment
Идентификатор и ключ персонализированы для меня, поэтому я не могу привести пример (если это имеет смысл). Я действительно не знаю, как оценить содержимое самого API.   -  person JassiL    schedule 11.01.2018
comment
два момента: (1) rawtoChar пишется как «rawToChar» (2) Ваш r3 уже является data.frame (вы можете проверить сами, набрав is.data.frame(r3)   -  person Richard    schedule 28.08.2018


Ответы (1)


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

Итак, в основном, второй элемент этого списка — это содержимое JSON, преобразованное в собственный фрейм данных R. По моему опыту, после того, как вы зайдете так далеко, вам придется немного повозиться... но, надеюсь, это поможет вам начать.

person jalind    schedule 11.01.2018
comment
Большое спасибо, я попробую и сообщу, как у меня дела - person JassiL; 12.01.2018