将字符串分成多列

时间:2019-12-03 22:03:03

标签: r tidyr stringr

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

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的解决方案。

3 个答案:

答案 0 :(得分:5)

我们可以在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

答案 1 :(得分: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" 

答案 2 :(得分:2)

我们可以将cSplit中的splitstackshapestripWhite = FALSEsep = ""一起使用来拆分列中的每个字母。

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