Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 当分隔字符位于字符串中时,将字符向量拆分为数据帧_R_Dataframe - Fatal编程技术网

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

R 当分隔字符位于字符串中时,将字符向量拆分为数据帧,r,dataframe,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))) B的确,越来越复杂的正则表达式几乎无法实现 这种方法有点冒险。它: 标识方括号内的所有讨厌字符 用哨兵字符替换这些字符(我选择了|) 在分隔符上拆分字符串 修改所有列以将前哨字符更改

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

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)))

B的确,越来越复杂的正则表达式几乎无法实现

这种方法有点冒险。它:

  • 标识方括号内的所有讨厌字符
  • 用哨兵字符替换这些字符(我选择了
    |
  • 在分隔符上拆分字符串
  • 修改所有列以将前哨字符更改回句点(
  • 正确选择哨兵字符很重要,因为假设所有讨厌的字符都包含在对称方括号中

    library(tidyverse)
    
    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)))
    
    B %>%
      mutate(B = gsub("(?<=\\[)([^\\.])*\\.([^\\.])*(?=\\])", "\\1|\\2", B, perl = T)) %>%
      separate(B, into = c("a", "b", "c", "d"), sep = "\\.", extra = "merge") %>%
      mutate_each(funs(gsub("\\|", "\\.", .))) %>%
      tail
    
    #>                     a       b     c  d
    #> 95   'ab[2.1]abcdefgh abc_123 1_123 1'
    #> 96   'ab[2.1]abcdefgh abc_123 1_123 1'
    #> 97   'ab[2.1]abcdefgh abc_123 1_123 1'
    #> 98   'ab[2.1]abcdefgh abc_123 1_123 1'
    #> 99   'ab[2.1]abcdefgh abc_123 1_123 1'
    #> 100  'ab[2.1]abcdefgh abc_123 1_123 1'
    
    库(tidyverse)
    B%
    
    mutate(B=gsub(“(?一种使用正则表达式分组的base R尝试):

    数据: 说明: 这里的想法是将每一行分成5个块,并使用
    gsub
    以构成新列的块为目标。我将使用
    'ab[+12.1]abcdefgh.abc_123.1_123.1'
    作为示例。在这里,您希望将字符串分成以下块:
    'ab[+12.1
    ]
    abcdefgh
    abc_123.1_123.1'
    ,然后您可以将这些组重新连接在一起,但第四个组被替换为
    。此时,您已经拥有了所需的所有四列,它们之间用
    \uu
    分隔。随后,您可以继续操作并在上拆分新行
    \
    生成4个不同的列


    我希望这能有所帮助。

    read.table(text=gsub('(?I)|)(?仅使用
    cSplit
    的相同概念将类似于:
    cSplit(cSplit(B,“B”,“B”)[,B_1:=gsub((.*)\(.*)$,“\\1\\2”,“B_1)],“B_1”),“
    library(stringi)
    library(splitstackshape)
    
    X <- cSplit_f(B,1,sep='_')
    Y <- lapply(data.frame(X[[1]]),stri_split_fixed,pattern='.',simplify= TRUE)
    
    library(tidyverse)
    
    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)))
    
    B %>%
      mutate(B = gsub("(?<=\\[)([^\\.])*\\.([^\\.])*(?=\\])", "\\1|\\2", B, perl = T)) %>%
      separate(B, into = c("a", "b", "c", "d"), sep = "\\.", extra = "merge") %>%
      mutate_each(funs(gsub("\\|", "\\.", .))) %>%
      tail
    
    #>                     a       b     c  d
    #> 95   'ab[2.1]abcdefgh abc_123 1_123 1'
    #> 96   'ab[2.1]abcdefgh abc_123 1_123 1'
    #> 97   'ab[2.1]abcdefgh abc_123 1_123 1'
    #> 98   'ab[2.1]abcdefgh abc_123 1_123 1'
    #> 99   'ab[2.1]abcdefgh abc_123 1_123 1'
    #> 100  'ab[2.1]abcdefgh abc_123 1_123 1'
    
    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'