【问题标题】:Pivot a character vector to a data.frame with specified number of columns将字符向量旋转到具有指定列数的 data.frame
【发布时间】:2021-05-29 01:45:29
【问题描述】:

我有一个数据向量,其中每 4 行开始一个新的观察。我需要旋转数据,以便前四个值成为第一行,接下来的四个值成为第二行,依此类推。

这是一个简化的例子……

给定以下数据:

a <- rep(c("a", "b", "c", "d"), 3)

想要的输出是:

  A_lab B_lab C_lab D_lab
1     a     b     c     d
2     a     b     c     d
3     a     b     c     d

【问题讨论】:

  • 可能是这样的:as.data.frame(matrix(a, ncol = 4, byrow = TRUE)) 如果你想要 4 列?

标签: r data-munging


【解决方案1】:

如果你想要一个矩阵,只需调用:

matrix(a, ncol=4, byrow=TRUE)

     [,1] [,2] [,3] [,4]
[1,] "a"  "b"  "c"  "d" 
[2,] "a"  "b"  "c"  "d" 
[3,] "a"  "b"  "c"  "d"

对于 data.frame,将结果通过管道传输到 data.frame:

data.frame(matrix(a, ncol=4, byrow=TRUE))

  X1 X2 X3 X4
1  a  b  c  d
2  a  b  c  d
3  a  b  c  d

【讨论】:

    【解决方案2】:

    这是一个使用 dplyr 和 tidyverse 的选项

    require(tidyverse)
    a <- rep(c("a", "b", "c", "d"), 3)
    
    labs = rep(c("A_lab", "B_lab", "C_lab", "D_lab"), 3)
    obs_id <- rep(1:3, each=length(unique(a)))
    
    
    tibble(vals = a, labs = labs,  obs_id = obs_id) %>%
      pivot_wider(obs_id, values_from = vals, names_from = labs)
    
    
    # A tibble: 3 x 5
    #  obs_id A_lab B_lab C_lab D_lab
    #   <int> <chr> <chr> <chr> <chr>
    #1      1 a     b     c     d    
    #2      2 a     b     c     d    
    #3      3 a     b     c     d 
    

    【讨论】:

      【解决方案3】:
      a <- rep(c("a", "b", "c", "d"), 3)
      
      library(tidyverse)
      a %>% as.data.frame() %>% setNames('V') %>%
        mutate(dummy = (( row_number() -1) %% 4)+1) %>%
        pivot_wider(names_from = dummy, values_from = V, values_fn = list) %>%
        unnest(everything())
      #> # A tibble: 3 x 4
      #>   `1`   `2`   `3`   `4`  
      #>   <chr> <chr> <chr> <chr>
      #> 1 a     b     c     d    
      #> 2 a     b     c     d    
      #> 3 a     b     c     d
      

      reprex package (v2.0.0) 于 2021-06-01 创建

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-05-24
        • 2020-01-24
        • 2013-04-07
        • 2011-10-27
        • 1970-01-01
        相关资源
        最近更新 更多