Конвертировать пары ключ-значение URL-запроса в фрейм данных

Как я могу разобрать строки запроса URL, которые по сути являются парами ключ-значение в типичном data.frame? Есть ли простой способ сделать это в R? Может с библиотекой?

Входные данные:

unique1=blub&same=aaaa-aaaa-aaaa&date=01.01.2017&time=12:30:00
date=02.01.2017&unique2=blub&time=12:30:00&same=bbbb-bbbb
same=cccc&time=12:35:00&unique3=blub&date=03.01.2017`

Желаемый вывод как data.frame:

        date           same     time unique1 unique2 unique3
1 01.01.2017 aaaa-aaaa-aaaa 12:30:00    blub    <NA>    <NA>
2 02.01.2017      bbbb-bbbb 12:30:00    <NA>    blub    <NA>
3 03.01.2017           cccc 12:35:00    <NA>    <NA>    blub

1 ответ

Решение

Вот один из методов. Обратите внимание, что поля разделяются на "&", а "значение ключа" - на "=". Затем мы используем strsplit создать список каждой строки, используя оба символа для разделения. Во второй строке используйте регулярность данных, используя модуль 2 для отделения ключей от значений. Это возвращает вложенный список, чтобы мы могли передать его data.table"s rbindlist вернуть data.table

# get list of key-values by line
tmp <- strsplit(urlDat, "&|=")
# use modulus to select keys and values
tmp <- lapply(tmp, function(x) setNames(as.list(x[seq_along(x) %% 2 == 0L]),
                                         x[seq_along(x) %% 2 == 1L]))
library(data.table)
dat <- rbindlist(tmp, fill=TRUE, use.names=TRUE)

это возвращается

dat
   unique1           same       date     time unique2 unique3
1:    blub aaaa-aaaa-aaaa 01.01.2017 12:30:00      NA      NA
2:      NA      bbbb-bbbb 02.01.2017 12:30:00    blub      NA
3:      NA           cccc 03.01.2017 12:35:00      NA    blub

Столбцы вышли из строя, но это достаточно легко исправить с помощью стандартной индексации, [,

setDF(dat)[, c("date", "same", "time", "unique1", "unique2", "unique3")]
        date           same     time unique1 unique2 unique3
1 01.01.2017 aaaa-aaaa-aaaa 12:30:00    blub    <NA>    <NA>
2 02.01.2017      bbbb-bbbb 12:30:00    <NA>    blub    <NA>
3 03.01.2017           cccc 12:35:00    <NA>    <NA>    blub

где setDF принуждает данные в data.frame на месте (без копий).

данные

urlDat <- readLines(textConnection(
"unique1=blub&same=aaaa-aaaa-aaaa&date=01.01.2017&time=12:30:00
date=02.01.2017&unique2=blub&time=12:30:00&same=bbbb-bbbb
same=cccc&time=12:35:00&unique3=blub&date=03.01.2017"))
Другие вопросы по тегам