我想将向量中的每个字符串分成列,但我不能这样做!
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的新手。请不要有人请求帮助!
答案 0 :(得分:4)
使用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
恰好包含三个字符的情况。
使用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