在数据框中每隔x个字符分割字符串

4

我知道这里有一些关于如何将字符串按每个 nth 字符拆分的答案,例如这个这个。然而,这些答案都比较特定于某个问题,并且主要与单个字符串有关,而不是与包含多个字符串的数据框有关。


示例数据

df <- data.frame(id = 1:2, seq = c('ABCDEFGHI', 'ZABCDJHIA'))

看起来是这样的:

  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) 我希望能有一个类似的函数(或者也许可以用cSplit实现),以便每三个字符进行分割。


2个回答

4
一个选择是分离
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)

或者使用基础 R,使用 strsplit 按每个 3 个字符的实例拆分 'seq' 列,通过传递一个正则表达式 lookaround 到列表中并将列表元素 rbind。
df[paste0("x", 1:3)] <- do.call(rbind, 
           strsplit(as.character(df$seq), "(?<=.{3})", perl = TRUE))

注意:最好避免以数字等非标签字符开头的列名。因此,在名称前面添加 'x'。


1
好的,这很聪明;)谢谢!比我之前读到的其他答案清晰多了。 - CodeNoob
如何使tidyverse更加通用,因为现在我必须同时提供列名和拆分点。 - CodeNoob
1
@CodeNoob 你可以使用 seq 函数来创建拆分点,例如 seq(3, nchar(seq)-3, by = 3) - akrun

1
你可以使用read.fwf(读取固定宽度格式文件)在base中每x个字符分割字符串,需要提供文件或connection。请注意,保留HTML标签。
read.fwf(file=textConnection(as.character(df$seq)), widths=c(3,3,3))

   V1  V2  V3
1 ABC DEF GHI
2 ZAB CDJ HIA

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接