2015-10-08 2 views
2

у меня есть таблица, в которой первый столбец:Split столбец на несколько столбцов

chr10:100002872-100002872 
chr10:100003981-100003981 
chr10:100004774-100004774 
chr10:100005285-100005285 
chr10:100007123-100007123 

Я хочу, чтобы преобразовать его в 3 отдельных столбцов, но я не мог определить «:» и «-», чтобы использоваться strsplit команда. Что мне делать?

+1

Используйте '|' для разделения разделительных символов? – A5C1D2H2I1M1N2O1R2T1

+0

Что значит? пожалуйста, объясните больше – YBC

ответ

7

Вот один из способов:

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 
6

подобным же образом с tidyr. Если вы хотите сохранить исходный столбец, то вы можете добавить и convert = TRUE, если вы хотите установить соответствующие классы в новые столбцы. separate имеет регулярное выражение по умолчанию для разделения без символов/числовых значений, поэтому вам не нужно указывать свое условие. Если в некоторых рядах отсутствуют компоненты, добавьте , extra = "merge"

library(tidyr) 
separate(DF, "V1", paste0("V1.",1:3)) 
# V1.1  V1.2  V1.3 
# 1 chr10 100002872 100002872 
# 2 chr10 100003981 100003981 
# 3 chr10 100004774 100004774 
# 4 chr10 100005285 100005285 
# 5 chr10 100007123 100007123 
Смежные вопросы