我有一个以下形式的数据框:
B <- data.frame(B=c(rep(" 'abcefgh.abc_123.1_123.1'",length=50),
rep(" 'ab[+12.1]abcdefgh.abc_123.1_123.1'",length=50)))
我需要将这一列拆分为 4 列。我的第一次尝试是仅使用 for 循环和 strsplit() 命令来剪切每个观察结果并将其以所需的格式粘贴回一起。
Bsplit <- data.frame()
for (i in 1:nrow(B)){
temp3 <- strsplit(as.character(B$B[i]),split='_', fixed= TRUE)
temp4 <- strsplit(temp3[[1]][1],split='.',fixed= TRUE)
if(is.na(temp4[[1]][3])){
bsplit <- data.frame(a=temp4[[1]][1],b=temp4[[1]][2],c=temp3[[1]][2],d=temp3[[1]][3])
Bsplit <- rbind(Bsplit,bsplit)
}
else {
bsplit <- data.frame(a=paste(temp4[[1]][1],'.',temp4[[1]][2],sep=''),b=temp4[[1]][3],
c=temp3[[1]][2],d=temp3[[1]][3])
Bsplit <- rbind(Bsplit,bsplit)
}
}
这给出了期望的结果,但实际应用起来还很慢。在第二次尝试中,我结合使用了 cSplit_f() 命令和 stri_split_fixed()。
library(stringi)
library(splitstackshape)
X <- cSplit_f(B,1,sep='_')
Y <- lapply(data.frame(X[[1]]),stri_split_fixed,pattern='.',simplify= TRUE)
问题是,当字符串采用 'ab[+12.1]abcdefgh.abc_123.1_123.1' 形式时, r 会像这样 'ab[+12' | 'abcdefgh' | 'abcdefgh' | 'abc' | 'abc' | 123.1 | 123.1 123.1。如何保护字符串,使其忽略“.”分隔符并返回 'ab[+12.1]abcdefgh' | 'abc' | 'abc' | 123.1 | 123.1 123.1。
最佳答案
使用正则表达式分组的基本 R 尝试:
数据:
mydf <- data.frame(B=c(rep(" 'abcefgh.abc_123.1_123.1'",length=50),
rep(" 'ab[+12.1]abcdefgh.abc_123.1_123.1'",length=50)))
代码:
new_df <- do.call(rbind, strsplit(gsub("(['\\w\\+\\.\\[]*)(\\]*)([a-z]+)(\\.)([\\w\\.']+)",
"\\1\\2\\3_\\5",
trimws(mydf$B),
perl = T), split = "_"))
new_df <- data.frame(new_df)
输出:
# Just a select number of rows
X1 X2 X3 X4
'abcefgh abc 123.1 123.1'
'abcefgh abc 123.1 123.1'
'abcefgh abc 123.1 123.1'
'abcefgh abc 123.1 123.1'
'abcefgh abc 123.1 123.1'
'abcefgh abc 123.1 123.1'
'ab[+12.1]abcdefgh abc 123.1 123.1'
'ab[+12.1]abcdefgh abc 123.1 123.1'
'ab[+12.1]abcdefgh abc 123.1 123.1'
'ab[+12.1]abcdefgh abc 123.1 123.1'
'ab[+12.1]abcdefgh abc 123.1 123.1'
'ab[+12.1]abcdefgh abc 123.1 123.1'
说明:
这里的想法是将每一行分为 5 个 block ,并使用 gsub
来定位构成新列的 block 。我将使用 'ab[+12.1]abcdefgh.abc_123.1_123.1'
作为示例。在这里,您希望将字符串分为以下 block :'ab[+12.1
、]
、abcdefgh
、。
和 abc_123.1_123.1'
,然后您可以将这些组重新连接在一起,但第四组除外,该组被替换为 _
。此时,您已拥有所需的所有四列,以 _
分隔。随后,您可以直接在 _
上拆分新行以生成 4 个不同的列。
我希望这会有所帮助。
关于r - 当分隔字符位于字符串中时,将字符向量拆分为数据帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40162403/