将 url 查询键值对转换为数据框
Convert url query key-value pairs to data frame
如何将 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
这是一种方法。请注意,字段由“&”分隔,"key-value" 由“=”分隔。然后,我们使用 strsplit
生成每一行的列表,使用两个字符进行拆分。在第二行中,利用数据的规律性,使用模数 2 将键与值分开。这个 return 是一个嵌套列表,因此我们可以将它提供给 data.table
的 rbindlist
到 return 一个 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)
这个returns
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
将 dat 强制转换为 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"))
如何将 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
这是一种方法。请注意,字段由“&”分隔,"key-value" 由“=”分隔。然后,我们使用 strsplit
生成每一行的列表,使用两个字符进行拆分。在第二行中,利用数据的规律性,使用模数 2 将键与值分开。这个 return 是一个嵌套列表,因此我们可以将它提供给 data.table
的 rbindlist
到 return 一个 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)
这个returns
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
将 dat 强制转换为 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"))