使用 tidyr::separate 和 sep="" 将一列分隔成多列
Separate a column into multiple columns using tidyr::separate with sep=""
df <- data.frame(category = c("X", "Y"), sequence = c("AAT.G", "CCG-T"), stringsAsFactors = FALSE)
df
category sequence
1 X AAT.G
2 Y CCG-T
我想将 sequence
列分成 5 列(每个字符一列)。我试图用 tidyr::separate
来做到这一点,但它在内部使用 stringi::stri_split_regex
不接受空字符串作为分隔符(尽管 sep
参数应该采用正则表达式)。
library(tidyr)
separate(df, sequence, into = paste0("V", 1:5), sep="")
Error: Values not split into 5 pieces at 1, 2
In addition: Warning messages:
1: In stringi::stri_split_regex(value, sep, n_max) :
empty search patterns are not supported
2: In stringi::stri_split_regex(value, sep, n_max) :
empty search patterns are not supported
预期输出如下所示:
category V1 V2 V3 V4 V5
1 X A A T . G
2 Y C C G - T
您可以使用 tidyr
中的 extract
来完成此操作
library(tidyr)
extract(df, sequence, into=paste0('V', 1:5), '(.)(.)(.)(.)(.)')
# category V1 V2 V3 V4 V5
#1 X A A T . G
#2 Y C C G - T
或者使用 gsub
创建一个分隔符,并将其用作 separator
的 sep
library(dplyr)
library(tidyr)
df %>%
mutate(sequence=gsub('(?<=.)(?=.)', ',', sequence, perl=TRUE)) %>%
separate(sequence, into=paste0('V', 1:5), sep=",")
# category V1 V2 V3 V4 V5
#1 X A A T . G
#2 Y C C G - T
或者您可以使用 cSplit
library(splitstackshape)
setnames(cSplit(df, 'sequence', '', stripWhite=FALSE),
2:6, paste0('V', 1:5))[]
# category V1 V2 V3 V4 V5
#1: X A A T . G
#2: Y C C G - T
sep
可以是整数向量。使用 sep=1:4
就足够了,但是 5 也可以,而且看起来更好一些。
df %>% separate(sequence, into = paste0("V", 1:5), sep = 1:5)
给予:
category V1 V2 V3 V4 V5
1 X A A T . G
2 Y C C G - T
df <- data.frame(category = c("X", "Y"), sequence = c("AAT.G", "CCG-T"), stringsAsFactors = FALSE)
df
category sequence
1 X AAT.G
2 Y CCG-T
我想将 sequence
列分成 5 列(每个字符一列)。我试图用 tidyr::separate
来做到这一点,但它在内部使用 stringi::stri_split_regex
不接受空字符串作为分隔符(尽管 sep
参数应该采用正则表达式)。
library(tidyr)
separate(df, sequence, into = paste0("V", 1:5), sep="")
Error: Values not split into 5 pieces at 1, 2
In addition: Warning messages:
1: In stringi::stri_split_regex(value, sep, n_max) :
empty search patterns are not supported
2: In stringi::stri_split_regex(value, sep, n_max) :
empty search patterns are not supported
预期输出如下所示:
category V1 V2 V3 V4 V5
1 X A A T . G
2 Y C C G - T
您可以使用 tidyr
extract
来完成此操作
library(tidyr)
extract(df, sequence, into=paste0('V', 1:5), '(.)(.)(.)(.)(.)')
# category V1 V2 V3 V4 V5
#1 X A A T . G
#2 Y C C G - T
或者使用 gsub
创建一个分隔符,并将其用作 separator
sep
library(dplyr)
library(tidyr)
df %>%
mutate(sequence=gsub('(?<=.)(?=.)', ',', sequence, perl=TRUE)) %>%
separate(sequence, into=paste0('V', 1:5), sep=",")
# category V1 V2 V3 V4 V5
#1 X A A T . G
#2 Y C C G - T
或者您可以使用 cSplit
library(splitstackshape)
setnames(cSplit(df, 'sequence', '', stripWhite=FALSE),
2:6, paste0('V', 1:5))[]
# category V1 V2 V3 V4 V5
#1: X A A T . G
#2: Y C C G - T
sep
可以是整数向量。使用 sep=1:4
就足够了,但是 5 也可以,而且看起来更好一些。
df %>% separate(sequence, into = paste0("V", 1:5), sep = 1:5)
给予:
category V1 V2 V3 V4 V5
1 X A A T . G
2 Y C C G - T