разбить строку каждые x символов в кадре данных - PullRequest
3 голосов
/ 26 мая 2019

Я знаю, что здесь есть несколько ответов о разбиении строки на каждый символ 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 голосов
/ 26 мая 2019

Опция будет 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 R, используя strsplit, разделите столбец 'seq' для каждого экземпляра из 3 символов, передавая выражение поиска регулярных выражений в list, а затем rbind элементы list

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

ПРИМЕЧАНИЕ. Лучше избегать имен столбцов, начинающихся с нестандартных меток, таких как цифры. По этой причине в начале названия добавляется 'x'

1 голос
/ 27 мая 2019

Вы можете разделить строку каждые x символов в base также с помощью read.fwf (чтение файлов формата с фиксированной шириной) ,для которого требуется либо файл, либо соединение .

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

   V1  V2  V3
1 ABC DEF GHI
2 ZAB CDJ HIA
...