将 R 字符串拆分为单个字符

Split R string into individual characters

我认为这应该很简单,但我找不到另一个适用于我的目的的示例。我在 R 的 1 列中有许多 DNA 序列,但我想将它们分成许多列,每列 1 个碱基对。例如:

V
ggggcc
cccctt
tttttt
aaaaaa

我希望它看起来像

V V V V V V
 g   g   g   g   c   c
 c   c   c   c   t   t
 t   t   t   t   t   t
 a   a   a   a   a   a

我试过了

paste(L1HS2, collapse = "")
unlist(strsplit(L1HS2, split = ""))

data.frame(str_split_fixed(L1HS2, "", max(nchar(L1HS2))))

但是我丢失了数据帧结构,最后得到了 1 行很长的列。这一定很简单吧?

你可以使用

data.frame(Reduce(rbind, strsplit(df$V1, "")))

这个returns

     X1 X2 X3 X4 X5 X6
init  g  g  g  g  c  c
X     c  c  c  c  t  t
X.1   t  t  t  t  t  t
X.2   a  a  a  a  a  a

data.frame(do.call(rbind, strsplit(df$V1, "")))

哪个returns

  X1 X2 X3 X4 X5 X6
1  g  g  g  g  c  c
2  c  c  c  c  t  t
3  t  t  t  t  t  t
4  a  a  a  a  a  a

您可以使用 tidyr 中的 separate

# first the data:
'V1
ggggcc
cccctt
tttttt
aaaaaa' %>% data.table::fread(data.table = FALSE) -> df

sl <- seq_len(nchar(df$V1[1]))
separate(df, V1, paste0('X', sl), sep = sl)
  X1 X2 X3 X4 X5 X6
1  g  g  g  g  c  c
2  c  c  c  c  t  t
3  t  t  t  t  t  t
4  a  a  a  a  a  a

在空字符串 ("") 上分隔并不能很好地与 separate 一起使用,所以我改为在每个数字位置 separate

另一个可能的解决方案:

library(tidyverse)

df <- data.frame(V1 = c("ggggcc", "cccctt", "tttttt", "aaaaaa"))

str_split(df$V1, "", simplify = T) %>% data.frame

#>   X1 X2 X3 X4 X5 X6
#> 1  g  g  g  g  c  c
#> 2  c  c  c  c  t  t
#> 3  t  t  t  t  t  t
#> 4  a  a  a  a  a  a