Разбор JSON в "R" - PullRequest
       4

Разбор JSON в "R"

0 голосов
/ 21 мая 2019

Я изучаю «R», поэтому этот вопрос может быть тривиальным для большинства из вас.

Я хочу создать Фрейм данных из данных JSON .

JSON Выглядит так:

{
"Meta Data": {
    "1. Information": "Daily Prices (open, high, low, close) and Volumes",
    "2. Symbol": "MSFT",
    "3. Last Refreshed": "2019-05-17 10:01:49",
    "4. Output Size": "Compact",
    "5. Time Zone": "US/Eastern"
},
"Time Series (Daily)": {
    "2019-05-17": {
        "1. open": "128.3050",
        "2. high": "129.0600",
        "3. low": "128.2700",
        "4. close": "128.8200",
        "5. volume": "3817460"
    },
    "2019-05-16": {
        "1. open": "126.7500",
        "2. high": "129.3800",
        "3. low": "126.4600",
        "4. close": "128.9300",
        "5. volume": "29676333"
    },
 ...
 }
}

И я хочу разобрать его в одну таблицу со столбцами day|open|high|low|close|volume

Можно ли сделать это без циклов for?

Ответы [ 2 ]

1 голос
/ 21 мая 2019

Считайте данные из набора fromJSON() из пакета jsonlite:

x=fromJSON('https://www.alphavantage.co/query?function=TIME_SERIES_DAILY&symbol=MSFT&apikey=demo')

Разблокируйте результирующий подсписок временных рядов с помощью plyr:ldply, затем преобразуйте данные из длинного в широкое с помощью spread() из пакета tidyr:

x2 = spread(plyr::ldply(x$`Time Series (Daily)`, stack), key = ind, value = 'values')

Переименовать столбцы по желанию:

colnames(x2) = c('day', 'open', 'high', 'low', 'close', 'volume')
0 голосов
/ 21 мая 2019

Для анализа файла JSON лучше всего использовать библиотеку jsonlite.Он отлично работает с «простыми» файлами JSON, которые могут быть проанализированы непосредственно во фрейме данных.Однако ваш входной файл не так прост, поэтому вам нужно разбить чтение файлов на несколько этапов, чтобы получить красиво отформатированный фрейм данных.

library(jsonlite)
library(dplyr)
library(tibble)
library(stringi)
df <- data.frame(do.call(rbind, fromJSON("./example.json")[[2]]))
dates <- as.Date(rownames(df), format="%Y-%m-%d")
df <- df %>% mutate_all(as.numeric) %>% add_column(dates, .before=1)
colnames(df) <- stri_trans_totitle(stri_replace_all_regex(colnames(df), "X\\d\\.\\.", ""))

x Обратите внимание, что я взял второй элемент (начального) списка, прочитанного функцией fromJSON, поскольку первая запись - это ваши метаданные.Остальная часть кода - это навороты, чтобы получить желаемую форму кадра.Если вы хотите, чтобы даты были именами строк, а не столбцов во фрейме, используйте функцию tibble::column_to_rownames().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...