将网址查询键值对转换为数据框

时间:2017-10-04 16:43:51

标签: r url dataframe key-value

如何解析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 个答案:

答案 0 :(得分:1)

这是一种方法。请注意,字段按“&amp;”拆分并且“键值”被“=”分开。然后,我们使用strsplit生成每行的列表,使用两个字符进行拆分。在第二行中,利用数据的规律性,使用模数2将键与值分开。这将返回一个嵌套列表,以便我们可以将其提供给data.table的{​​{1}}以返回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 将dat强制转换为data.frame(无副本)。

数据

setDF