如何使用tidyr将矢量中字符串中的每个字符分隔为一列

时间:2018-04-17 21:02:24

标签: r tidyr

我想将向量中的每个字符串分成列,但我不能这样做!

library(tidyr)  
    library(dplyr)
    df <- data.frame(x = c("abe", "bas", "dds", "eer"))
    df %>% separate(x, c("A", "B", "C"), sep=1)

我想要的输出看起来像这样

  A B C
1 a b e
2 b a s
3 d d s
4 e e r

sep = 1适用于2个字符,但不适用于3.我希望像sep =“。”这样的正则表达式。或sep =“[a-z]”也会起作用,但事实并非如此。

这可能非常简单,但我是R的新手。请不要有人请求帮助!

3 个答案:

答案 0 :(得分:4)

方法1

使用separate

的正面观察
df %>%
    separate(x, c("A", "B", "C"), sep = "(?<=.)", extra = "drop")
#  A B C
#1 a b e
#2 b a s
#3 d d s
#4 e e r

请注意,这仅适用于每个字符串x恰好包含三个字符的情况。

方法2

使用strsplit

df %>%
    mutate(tmp = strsplit(as.character(x), "")) %>%
    unnest() %>%
    group_by(x) %>%
    mutate(n = 1:n()) %>%
    spread(n, tmp) %>%
    ungroup() %>%
    select(-x)
## A tibble: 4 x 3
#  `1`   `2`   `3`
#  <chr> <chr> <chr>
#1 a     b     e
#2 b     a     s
#3 d     d     s
#4 e     e     r

如果需要,通过用x填充列,这也将允许不同长度的字符串NA

答案 1 :(得分:3)

您对自己的解决方案非常接近。只需为sep参数添加第二个位置。

所以:

library(tidyr)  
library(dplyr)
df <- data.frame(x = c("abe", "bas", "dds", "eer"))
df %>% separate(x, c("A", "B", "C"), sep = c(1,2))

  A B C
1 a b e
2 b a s
3 d d s
4 e e r

答案 2 :(得分:2)

尽管你想要一个非R-base解决方案,但这里只是一个R基础方法。

> x <- data.frame(do.call(rbind, strsplit(as.character(df$x), "")))
> names(x) <- LETTERS[1:3]
> x
  A B C
1 a b e
2 b a s
3 d d s
4 e e r