我的数据集中有一列,我想要分割一串字符.
df = data.frame(col = c("BrBkRY","BBkRBr","YBRG","RBBk"))
Run Code Online (Sandbox Code Playgroud)
这是我想用来有条件地分割的矢量.
sep = c("Br","Bk","R","Y","B","G")
Run Code Online (Sandbox Code Playgroud)
这应该是最终的样子.我亲手做到了.
df2 = data.frame(col = c("BrBkRY","BBkRBr","YBRG","RBBk"),
col1 = c("Br","B","Y","R"),
col2 = c("Bk","Bk","B","B"),
col3 = c("R","R","R","Bk"),
col4 = c("Y","Br","G",""))
df2
col col1 col2 col3 col4
1 BrBkRY Br Bk R Y
2 BBkRBr B Bk R Br
3 YBRG Y B R G
4 RBBk R B Bk
Run Code Online (Sandbox Code Playgroud)
我正在考虑使用正则表达式,但通常,你需要一个分裂字符,如a .或-.但是根据角色的字符串,我不知道.此外,不想在B,K和B中拆分BkB.但我确实想在Bk和B中将它分开.是否有可以执行此操作的包?
您可以使用lookahead和lookbehind来使用正则表达式进行拆分.这个表达式表示要分割任何字符和国会大厦字母之间的空格.(?<=.)指定一个前导"任何字符"并(?=[A-Z])指定以下capitol."任何角色"和国会大厦实际上并不是比赛的一部分,所以他们不会在分裂中"被吸".
> lst <- strsplit(as.character(df$col), '(?<=.)(?=[A-Z])', perl=TRUE)
> lst
[[1]]
[1] "Br" "Bk" "R" "Y"
[[2]]
[1] "B" "Bk" "R" "Br"
[[3]]
[1] "Y" "B" "R" "G"
[[4]]
[1] "R" "B" "Bk"
Run Code Online (Sandbox Code Playgroud)
然后可以构建列,例如与akrun的答案完全相同:
dfN <- cbind(df[1], do.call(rbind, lapply(lst, `length<-`, max(lengths(lst)))))
colnames(dfN)[-1] <- paste0("col", colnames(dfN)[-1])
Run Code Online (Sandbox Code Playgroud)