将字符向量旋转到具有指定列数的 data.frame

问题描述

我有一个数据向量,其中每 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

解决方法

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

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,byrow=TRUE))

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

这是一个使用 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 
,
a <- rep(c("a",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 年 6 月 1 日创建