【问题标题】:Splitting a column into multiple columns in R, when there is no "separator"当没有“分隔符”时,将一列拆分为 R 中的多列
【发布时间】:2018-08-24 19:07:45
【问题描述】:

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

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

【问题讨论】:

  • 这被标记为重复但不同。所谓的重复有分隔符,而这个没有。
  • @G.Grothendieck "" 是这里的分隔符。该链接中至少有 2 个解决方案适合作为此处的答案并给出预期的输出。
  • str_split_fixed(x$y, "", 8); do.call("rbind", strsplit(as.character(x$y),'')); do.call(rbind, str_split(x$y, '')) `
  • 这个特别提到了对分离的偏好,而那个没有。

标签: r dataframe


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    这是使用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
    

    【讨论】:

      【解决方案3】:

      另一个 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
      

      【讨论】:

        【解决方案4】:

        来自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
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-12-10
          • 2021-05-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-03-17
          • 1970-01-01
          相关资源
          最近更新 更多