Вот один из способов:
library(data.table)
DF[, paste0("V1.",1:3) ] <- tstrsplit(DF$V1, ":|-")
# V1 V1.1 V1.2 V1.3
# 1 chr10:100002872-100002872 chr10 100002872 100002872
# 2 chr10:100003981-100003981 chr10 100003981 100003981
# 3 chr10:100004774-100004774 chr10 100004774 100004774
# 4 chr10:100005285-100005285 chr10 100005285 100005285
# 5 chr10:100007123-100007123 chr10 100007123 100007123
strsplit
принимает регулярные выражения, связанные с "или" оператор, |
, как сказал @AnandaMahto. tstrsplit
- это удобная функция, добавленная пакетом data.table.
Если конвертировать data.frame в data.table (который имеет много преимуществ, и никаких недостатков, за исключением небольшой кривой обучения), вы могли бы сделать:
setDT(DF)[, paste0("V1.",1:3) := tstrsplit(V1, ":|-")]
# V1 V1.1 V1.2 V1.3
# 1: chr10:100002872-100002872 chr10 100002872 100002872
# 2: chr10:100003981-100003981 chr10 100003981 100003981
# 3: chr10:100004774-100004774 chr10 100004774 100004774
# 4: chr10:100005285-100005285 chr10 100005285 100005285
# 5: chr10:100007123-100007123 chr10 100007123 100007123
Альтернативы. Есть (громоздкие) способы получить то же самое в базе R, как
DF[, paste0("V1.",1:3) ] <- do.call(rbind, strsplit(DF$V1, ":|-"))
И @ пакет AnandaMahto также имеет удобную функцию для этого:
library(splitstackshape)
cSplit(DF, "V1", ":|-")
# V1.1 V1.2 V1.3 V1_1
# 1: chr10 100002872 100002872 chr10:100002872-100002872
# 2: chr10 100003981 100003981 chr10:100003981-100003981
# 3: chr10 100004774 100004774 chr10:100004774-100004774
# 4: chr10 100005285 100005285 chr10:100005285-100005285
# 5: chr10 100007123 100007123 chr10:100007123-100007123
Используйте '|' для разделения разделительных символов? – A5C1D2H2I1M1N2O1R2T1
Что значит? пожалуйста, объясните больше – YBC