【问题标题】:Separate string into many columns将字符串分成多列
【发布时间】:2020-03-28 16:01:39
【问题描述】:

我想将字符串中的每个字母或符号分开,以组成一个新的data.frame,其尺寸等于字母数。我尝试使用 tidyr 包中的函数 separate,但结果不理想。

df <- data.frame(x = c('house', 'mouse'), y = c('count', 'apple'), stringsAsFactors = F)

意外的结果

df[1, ] %>% separate(x, c('A1', 'A2', 'A3', 'A4', 'A5'), sep ='')
    A1   A2   A3   A4   A5     y
1 <NA> <NA> <NA> <NA> <NA> count

预期输出

A1  A2  A3  A4  A5
 h   o   u   s   e
 m   o   u   s   e

欢迎使用stringr 的解决方案。

【问题讨论】:

    标签: r tidyr stringr


    【解决方案1】:

    我们可以将splitstackshape 中的cSplit 与stripWhite = FALSE 和sep = "" 一起使用来拆分列中的每个字母。

    splitstackshape::cSplit(df, "x", sep = "", stripWhite = FALSE)
    
    #       y x_1 x_2 x_3 x_4 x_5
    #1: count   h   o   u   s   e
    #2: apple   m   o   u   s   e
    

    【讨论】:

      【解决方案2】:

      base 中的解决方案是:

      do.call(rbind , sapply(df$x, function(col) strsplit(col, "")))
      
       #       [,1] [,2] [,3] [,4] [,5]
       # house "h"  "o"  "u"  "s"  "e" 
       # mouse "m"  "o"  "u"  "s"  "e" 
      

      【讨论】:

        【解决方案3】:

        我们可以在sep 中使用正则表达式环视来匹配每个字符之间的边界

        library(dplyr)
        library(tidyr)
        library(stringr)
        df %>%
           select(x) %>% 
           separate(x, into = str_c("A", 1:5), sep= "(?<=[a-z])(?=[a-z])")
        #  A1 A2 A3 A4 A5
        #1  h  o  u  s  e
        #2  m  o  u  s  e
        

        【讨论】:

          猜你喜欢
          • 2021-08-20
          • 2017-04-16
          • 2012-05-23
          • 2021-02-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多