При работе с API различных систем данные в ответе имеют форматы JSON или XML со сложной вложенной древовидной структурой. Распарсить такие данные та ещё задача. Часто программисты прибегают к преобразованию массива данных в список и в цикле разбирают элементы этого списка.
Всё можно сделать гораздо проще и без циклов с помощью пакета tidyr. Он входит в состав других пакетов, поэтому чаще всего отдельно его устанавливать и подключать нет необходимости.
Первым делом нужно преобразовать JSON или XML список во фрейм
‘название фрейма’ <- tibble( имя столбца = имя JSON-документа )
пример:
frame_d <- tibble( data = xml_list )
Теперь каждый элемент списка мы можем преобразовать в столбец:
frame_d %>% unnest_wider(data)
Если колонок слишком много и нужны только конкретные, можем использовать другую функцию пакета:
frame_d %>% hoist(data,
name_clmn1 = "name_clmn1",
name_clmn2 = "name_clmn2",
name_clmn3 = "name_clmn3"
)
Если имеем много уровневые вложение, то пишем так:
для примера элемент ‘user_access’ у нас имеет два параметра: ‘login’ и ‘password’
frame_d %>% hoist(data,
login = c("user_access", "login"),
pass = c("user_access", "password"),
clmn3 = "clmn3",
clmn4 = "clmn4"
)
При сложной структуре исходного документа может потребоваться преобразовать элементы списка не в столбцы, а в строки:
frame_d <- frame_d %>% unnest_longer(data)
Применяя комбинацию этих функций к разным элементам JSON или XML списков, можно относительно просто их распарсить, не прибегая к циклам.
Функция unnest_auto() может автоматически подобрать алгоритм парсинга, но её лучше использовать для разовых задач на стабильных данных. Если в исходных данных что-то изменится, функция может поменять алгоритм парсинга, и на выходе вы получите данные другой структуры.
Статья подготовлена по материалам Интернета