使用带有多个变量的收集/传播使用 dplyr 重塑 df

Reshaping df with dplyr using gather / spread with multiple variables

我正在尝试使用 dplyr gather 和 spread 函数重塑我的数据集以从该数据形状移动:

library(tidyverse)
# test data set
df = tibble(factor = c("a","a","b","b"),
           factor2 = c("d1","d2","d1","d2"),
           value1 = round(rnorm(4),1)*10,
           value2 = round(runif(4),2)*100)

看起来像这样:

# A tibble: 4 x 4
  factor factor2 value1 value2
  <chr>  <chr>    <dbl>  <dbl>
1 a      d1           4     97
2 a      d2         -21     10
4 b      d1          -2     65
5 b      d2         -14     93

看起来像这样的东西:

factor    d1val1   d1val2  d2val1  d2val2
a          4        97      -21     10
b         -2        65      -14     93

理想情况下,我想通过 dplyr spread / gather 来实现这一点。

一个选项是 gather 'value' 列为 'long' 格式,然后 unite 'factor2' 和 'key' 列为创建一个列,然后 spread 恢复为 'wide' 格式

library(dplyr)
library(tidyr)
df %>% 
  gather(key, val, value1:value2) %>% 
  unite(dcols, factor2, key, sep = "") %>%
  spread(dcols, val)

由于列类型相同,所以用gatherspread

也是可以的

另一种tidyverse可能是:

df %>% 
 gather(var, val, -c(factor, factor2)) %>%
 mutate(var = paste0(factor2, var)) %>%
 select(-factor2) %>%
 spread(var, val) 

  factor d1value1 d1value2 d2value1 d2value2
  <chr>     <dbl>    <dbl>    <dbl>    <dbl>
1 a            -4       85       -4       65
2 b             4       39       -1       20

它首先将数据从宽格式转换为长格式,不包括变量 "factor" 和 "factor2"。其次,它将 "factor2" 中的值和变量名称组合在一起。最后,它删除冗余变量和 returns 数据到所需的格式。

为了完整起见,dcast() 实现能够同时重塑多个变量:

library(data.table)
dcast(setDT(df), factor ~ factor2, value.var = c("value1", "value2"))
   factor value1_d1 value1_d2 value2_d1 value2_d2
1:      a         4       -21        97        10
2:      b        -2       -14        65        93