r - 当分隔字符位于字符串中时,将字符向量拆分为数据帧

标签 r dataframe

我有一个以下形式的数据框:

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]abcdefghabc_123.1_123.1',然后您可以将这些组重新连接在一起,但第四组除外,该组被替换为 _。此时,您已拥有所需的所有四列,以 _ 分隔。随后,您可以直接在 _ 上拆分新行以生成 4 个不同的列。

我希望这会有所帮助。

关于r - 当分隔字符位于字符串中时,将字符向量拆分为数据帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40162403/

相关文章:

python - 数据框的分组依据和列的平均值

python根据行值添加一列

R:如何在没有for循环的情况下计算回归

r - 什么是 “object of type ‘closure’ is not subsettable” 在 Shiny 中的错误?

python - Pandas 多数据集绘图错误

python - 使用 python 将新列从列表 append 到 df

r - 在 Rstudio 中修改 Tukey HSD 95% 系列 CL 图

javascript - 使用D3和Shiny在R中实现 `identify()`

r - "Reshape"长格式数据成两个序列

python - 如何使用 PyMySQL 将 Pandas Dataframe 插入 MySql