假设我有一个包含八位数字的数据框,每个数字对应一个
x <- data.frame(y = c(12345678, 87654321))
我想要8列,以便每一列对应一个数字,即
y1 y2 y3 y4 y5 y6 y7 y8
1 2 3 4 5 6 7 8
8 7 6 5 4 3 2 1
(这些列不必从y1到y8命名,我只是以说明的方式命名它们)
通常在R中,我会使用separate
,但是这里没有明确的分隔符。我该怎么办?
答案 0 :(得分:3)
separate
可以接受sep
参数中的列位置。就像在第1、2,...,7列之后有分隔符一样。
library(tidyr)
separate(x, y, into = paste0("y", 1:8), sep = 1:7)
给予:
y1 y2 y3 y4 y5 y6 y7 y8
1 1 2 3 4 5 6 7 8
2 8 7 6 5 4 3 2 1
答案 1 :(得分:1)
这是使用strsplit
as.data.frame(t(apply(x, 1, function(x) unlist(strsplit(as.character(x), "")))))
# V1 V2 V3 V4 V5 V6 V7 V8
#1 1 2 3 4 5 6 7 8
#2 8 7 6 5 4 3 2 1
或tidyverse
选项
library(tidyverse)
x %>%
rowid_to_column("row") %>%
mutate(y = strsplit(as.character(y), "")) %>%
unnest() %>%
group_by(row) %>%
mutate(var = paste0("y", 1:n())) %>%
spread(var, y) %>%
ungroup() %>%
select(-row)
# y1 y2 y3 y4 y5 y6 y7 y8
# <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr>
#1 1 2 3 4 5 6 7 8
#2 8 7 6 5 4 3 2 1
答案 2 :(得分:0)
另一种R基替代品
> data.frame(do.call(rbind, strsplit(as.character(x$y), "")))
X1 X2 X3 X4 X5 X6 X7 X8
1 1 2 3 4 5 6 7 8
2 8 7 6 5 4 3 2 1
答案 3 :(得分:0)
来自stringr
data.frame(stringr::str_split_fixed(x$y, "", 8))
X1 X2 X3 X4 X5 X6 X7 X8
1 1 2 3 4 5 6 7 8
2 8 7 6 5 4 3 2 1