没有“分隔符”时,在R中将一列拆分为多列

时间:2018-08-23 23:15:57

标签: r dataframe

假设我有一个包含八位数字的数据框,每个数字对应一个

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,但是这里没有明确的分隔符。我该怎么办?

4 个答案:

答案 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

的基本R选项
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