在数据框中将每个x字符拆分为字符串

时间:2019-05-26 17:47:32

标签: r string split character

我知道对于每个df <- data.frame(id = 1:2, seq = c('ABCDEFGHI', 'ZABCDJHIA')) 字符(例如this onethis one)拆分字符串有一些答案,但是这些都是针对特定问题的,并且大多与单个字符串有关,并且而不是包含多个字符串的数据帧。


示例数据

  id       seq
1  1 ABCDEFGHI
2  2 ZABCDJHIA

看起来像这样:

id  1   2   3
1   ABC DEF GHI
2   ZAB CDJ HIA

每三个字符分割一次

我想在每个行字符中的每一行中拆分字符串,以使结果数据帧如下所示:

splitstackshape

我尝试过的事情

我以前使用df %>% cSplit('seq', sep = '', stripWhite = FALSE, type.convert = FALSE)在单个字符上分割字符串,如下所示:<div class="mdl-textfield mdl-js-textfield mdl-textfield--floating-label"> <input class="mdl-textfield__input" type="text" id="sample3" name="passengername"> <label class="mdl-textfield__label" for="sample3">Passenger Name :</label> </div> 我很想拥有类似的功能(或者说cSplit可能)在每个字符上分割第三角色。

2 个答案:

答案 0 :(得分:3)

选项为separate

library(tidyverse)
df %>%
    separate(seq, into = paste0("x", 1:3), sep = c(3, 6))
# id  x1  x2  x3
#1  1 ABC DEF GHI
#2  2 ZAB CDJ HIA

如果我们想创建更通用的

n1 <- nchar(as.character(df$seq[1])) - 3
s1 <- seq(3, n1, by = 3)
nm1 <- paste0("x", seq_len(length(s1) +1))
df %>% 
    separate(seq, into = nm1, sep = s1)

或者使用base Rstrsplit,通过将正则表达式环顾传递到list然后rbind来将3个字符的每个实例的'seq'列分开list个元素

df[paste0("x", 1:3)] <- do.call(rbind, 
           strsplit(as.character(df$seq), "(?<=.{3})", perl = TRUE))

注意:最好避免以非标准标签(例如数字)开头的列名。因此,请在名称开头加上“ x”

答案 1 :(得分:1)

您还可以使用read.fwf (读取固定宽度格式文件) base 中将每个x字符分割成一个字符串。需要一个文件或一个connection

read.fwf(file=textConnection(as.character(df$seq)), widths=c(3,3,3))

   V1  V2  V3
1 ABC DEF GHI
2 ZAB CDJ HIA