如何将键/值字符串转换为不同的行?

Aiy*_*a K 2 split r key-value data-science

我有一个带有键值字符串的R数据集,如下所示:

quest<-data.frame(city=c("Atlanta","New York","Atlanta","Tampa"), key_value=c("rev=63;qty=1;zip=45987","rev=10.60|34;qty=1|2;zip=12686|12694","rev=12;qty=1;zip=74268","rev=3|24|8;qty=1|6|3;zip=33684|36842|30254"))
Run Code Online (Sandbox Code Playgroud)

转换为:

      city                                  key_value
1  Atlanta                     rev=63;qty=1;zip=45987
2 New York       rev=10.60|34;qty=1|2;zip=12686|12694
3  Atlanta                     rev=12;qty=1;zip=74268
4    Tampa rev=3|24|8;qty=1|6|3;zip=33684|36842|30254
Run Code Online (Sandbox Code Playgroud)

基于以上数据帧,我如何创建一个如下所示的新数据框:

      city  rev qty   zip
1  Atlanta 63.0   1 45987
2 New York 10.6   1 12686
3 New York 34.0   2 12686
4  Atlanta 12.0   1 74268
5    Tampa  3.0   1 33684
6    Tampa 24.0   6 33684
7    Tampa  8.0   3 33684
Run Code Online (Sandbox Code Playgroud)

"|" 是常用分隔符,它将确定要创建的行数.

Aar*_*ica 5

通过拆分;,然后通过=|,并结合成一个矩阵,使用第一部分作为名称.然后重复原始数据框的行,但是每个行都找到了很多行,并进行组合.我没有在这里将任何列转换为数字,它们被保留为字符.

a <- strsplit(as.character(quest$key_value), ";")
a <- lapply(a, function(x) {
    x <- do.call(cbind, strsplit(x, "[=|]"))
    colnames(x) <- x[1,]
    x[-1,,drop=FALSE]
})
b <- quest[rep(seq_along(a), sapply(a, nrow)), colnames(quest) != "key_value", drop=FALSE]
out <- cbind(b, do.call(rbind, a), stringsAsFactors=FALSE)
rownames(out) <- NULL
out
##       city   rev qty   zip
## 1  Atlanta    63   1 45987
## 2 New York 10.60   1 12686
## 3 New York    34   2 12694
## 4  Atlanta    12   1 74268
## 5    Tampa     3   1 33684
## 6    Tampa    24   6 36842
## 7    Tampa     8   3 30254
Run Code Online (Sandbox Code Playgroud)