Разбить строку через запятую на определенное количество частей в R - PullRequest
2 голосов
/ 03 апреля 2020

У меня есть строка значений, разделенных запятыми, которые я хотел бы разделить на несколько частей в зависимости от количества запятых.

Например: разделить следующую строку каждые 5 значений или запятых:

txt = "120923,120417,120416,105720,120925,120790,120792,120922,120928,120930,120918,120929,61065,120421" 

Результат будет:

[1] 120923,120417,120416,105720,120925
[2] 120790,120792,120922,120928,120930
[3] 120918,120929,61065,120421

Ответы [ 3 ]

4 голосов
/ 03 апреля 2020

Одна из базовых опций R будет заключаться в использовании gregexpr со следующим шаблоном регулярных выражений:

\d+(?:,\d+){0,4}

Этот шаблон будет соответствовать одному числу, с жадностью следуя от нуля до четырех других чисел CSV. Обратите внимание, что, поскольку шаблон является жадным, он всегда будет пытаться соответствовать максимальным доступным числам, оставшимся на входе.

txt <- "120923,120417,120416,105720,120925,120790,120792,120922,120928,120930,120918,120929,61065,120421"
regmatches(txt,gregexpr("\\d+(?:,\\d+){0,4}",txt))

[1] "120923,120417,120416,105720,120925" "120790,120792,120922,120928,120930"
[3] "120918,120929,61065,120421"     
4 голосов
/ 03 апреля 2020

Мы могли бы разделить text на запятую (',') и разделить их на группы по 5.

temp <- strsplit(txt, ",")[[1]]
split(temp, rep(seq_along(temp), each  = 5, length.out = length(temp)))

#$`1`
#[1] "120923" "120417" "120416" "105720" "120925"

#$`2`
#[1] "120790" "120792" "120922" "120928" "120930"

#$`3`
#[1] "120918" "120929" "61065"  "120421"

Если вы хотите, чтобы они были объединены в одну строку, мы можем использовать by

as.character(by(temp, rep(seq_along(temp), each  = 5, 
                      length.out = length(temp)), toString))
1 голос
/ 03 апреля 2020

Использование str_extract

library(stringr)
str_extract_all(txt, "\\d+(,\\d+){1,4}")[[1]]
#[1] "120923,120417,120416,105720,120925" "120790,120792,120922,120928,120930"
#[3] "120918,120929,61065,120421"   
...