将数据框中的分隔数据解析为R中的单独列

Cra*_*aig 6 r

我有一个看起来像这样的数据框

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中这样做呢?

MrF*_*ick 3

首先,这是 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)