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)
"|" 是常用分隔符,它将确定要创建的行数.
通过拆分;
,然后通过=
和|
,并结合成一个矩阵,使用第一部分作为名称.然后重复原始数据框的行,但是每个行都找到了很多行,并进行组合.我没有在这里将任何列转换为数字,它们被保留为字符.
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)