我有一个看起来像这样的数据框
A B C
1 3 X1=7;X2=8;X3=9
2 4 X1=10;X2=11;X3=12
5 6 X1=13;X2=14
Run Code Online (Sandbox Code Playgroud)
我想将C列解析为单独的列...
A B X1 X2 X3
1 3 7 8 9
2 4 10 11 12
5 6 13 14 NA
Run Code Online (Sandbox Code Playgroud)
怎么会在R中这样做呢?
首先,这是 data.frame 形式的示例数据
dd<-data.frame(
A = c(1L, 2L, 5L),
B = c(3L, 4L, 6L),
C = c("X1=7;X2=8;X3=9",
"X1=10;X2=11;X3=12", "X1=13;X2=14"),
stringsAsFactors=F
)
Run Code Online (Sandbox Code Playgroud)
现在,我定义了一个小辅助函数来获取像这样的向量c("A=1","B=2"),并将它们更改为像这样的命名向量c(A="1", B="2")。
namev<-function(x) {
a<-strsplit(x,"=")
setNames(sapply(a,'[',2), sapply(a,'[',1))
}
Run Code Online (Sandbox Code Playgroud)
现在我执行转换
#turn each row into a named vector
vv<-lapply(strsplit(dd$C,";"), namev)
#find list of all column names
nm<-unique(unlist(sapply(vv, names)))
#extract data from all rows for every column
nv<-do.call(rbind, lapply(vv, '[', nm))
#convert everything to numeric (optional)
class(nv)<-"numeric"
#rejoin with original data
cbind(dd[,-3], nv)
Run Code Online (Sandbox Code Playgroud)
这给了你
A B X1 X2 X3
1 1 3 7 8 9
2 2 4 10 11 12
3 5 6 13 14 NA
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3132 次 |
| 最近记录: |