2015-10-08 102 views
2

我有表中的列的第一列是:拆分到多個字段

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。如果您想保留原始列,您可以在 中添加, remove = FALSEconvert = 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