将一列拆分为多列
Split a column to multiple columns
我table第一列是:
chr10:100002872-100002872
chr10:100003981-100003981
chr10:100004774-100004774
chr10:100005285-100005285
chr10:100007123-100007123
我想将它转换为 3 个单独的列,但我无法定义“:”和“-”以使用 strsplit 命令。
我该怎么办?
这是一种方法:
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
正如@AnandaMahto 所说,strsplit
接受涉及 "or" 运算符 |
的正则表达式。 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
备选方案。有(麻烦的)方法可以在 base 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
也与tidyr
类似。如果你想保留原来的专栏你
如果要将相应的 类 设置为新列,可以添加 , remove = FALSE
和 convert = TRUE
。 separate
有一个默认的正则表达式来拆分非 character/numeric 值,因此您不需要指定您的条件。如果某些行缺少组件,请添加 , 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
我table第一列是:
chr10:100002872-100002872
chr10:100003981-100003981
chr10:100004774-100004774
chr10:100005285-100005285
chr10:100007123-100007123
我想将它转换为 3 个单独的列,但我无法定义“:”和“-”以使用 strsplit 命令。 我该怎么办?
这是一种方法:
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
正如@AnandaMahto 所说,strsplit
接受涉及 "or" 运算符 |
的正则表达式。 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
备选方案。有(麻烦的)方法可以在 base 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
也与tidyr
类似。如果你想保留原来的专栏你
如果要将相应的 类 设置为新列,可以添加 , remove = FALSE
和 convert = TRUE
。 separate
有一个默认的正则表达式来拆分非 character/numeric 值,因此您不需要指定您的条件。如果某些行缺少组件,请添加 , 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