5
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 つの列 (文字ごとに 1 つ)に分割したいと考えています。私はそれをやろうとしましたが、空の文字列をセパレーターとして受け入れないtidyr::separate内部的に使用します(ただし、引数は正規表現を取る必要があります)。stringi::stri_split_regexsep

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
4

2 に答える 2

4

extractからこれを行うことができますtidyr

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それsepseparator

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
于 2015-03-10T04:38:58.477 に答える
2

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
于 2019-06-15T23:11:32.657 に答える