将列拆分为多列

时间:2015-10-08 17:14:08

标签: r bioinformatics

我有第一栏的表:

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

我想将其转换为3个单独的列,但我无法使用strsplit命令定义“:”和“ - ”。 我该怎么办?

1 个答案:

答案 0 :(得分: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接受涉及&#34;或&#34;的正则表达式运营商,|,正如@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