以通用方式取消融化数据框

Un-melting a dataframe in generalised way

假设我有以下 data.frame

library(reshape2)

set.seed(1)

dat = data.frame(X1 = sample(letters, 10, replace = T), X2 = sample(letters, 10, replace = T), X3 = sample(LETTERS, 10, replace = T), X4 = sample(LETTERS[1:4], 10, replace = T), X5 = sample(11:13, 10, replace = T), X6 = sample(200:201, 10, replace = T))

dat

   X1 X2 X3 X4 X5  X6
1   q  w  J  B 12 201
2   t  c  U  A 12 200
3   q  c  W  A 11 200
4   b  u  E  C 11 201
5   p  m  C  B 13 201
6   g  t  V  A 12 201
7   t  d  F  C 13 201
8   x  t  P  D 11 201
9   d  e  E  D 13 200
10  l  m  L  D 13 201

现在我想要 un-melt 上面的数据框,这样,列将是列 X4 & X5 的值的唯一组合,值向量将是 X6,这将对应于除 X4, X5, and X6 以外的所有行(我的实际数据框有很多列,所以我不能明确命名那些剩余的列)

因此在上述情况下,最终数据帧的列将为 {X1, X2, X3, A-12 A-13, ... B-12, B-13, .. etc}

你能帮我用 reshapedcast() 函数实现这个吗?

感谢指点。

您可以 unite X4X5 列并使用 pivot_wider.

library(dplyr)
library(tidyr)

dat %>%
  unite(col, X4, X5) %>%
  pivot_wider(names_from = col, values_from = X6)

#   X1    X2    X3     D_12  C_11  A_13  B_11  B_13  B_12  C_13
#   <chr> <chr> <chr> <int> <int> <int> <int> <int> <int> <int>
# 1 y     a     U       200    NA    NA    NA    NA    NA    NA
# 2 d     u     E        NA   201    NA    NA    NA    NA    NA
# 3 g     u     I        NA    NA   201    NA    NA    NA    NA
# 4 a     j     Y       201    NA    NA    NA    NA    NA    NA
# 5 b     v     N        NA   201    NA    NA    NA    NA    NA
# 6 w     n     E        NA    NA    NA   201    NA    NA    NA
# 7 k     j     E        NA    NA    NA    NA   201    NA    NA
# 8 n     g     B        NA    NA    NA    NA    NA   200    NA
# 9 r     i     J        NA    NA    NA    NA    NA   201    NA
#10 s     o     Y        NA    NA    NA    NA    NA    NA   201 

dcast() 转换公式 允许一个 特殊变量 ... 表示所有其他变量不在公式中使用。所以,

library(reshape2)
dcast(dat, ... ~ X4 + X5, value.var = "X6")

应该return预期的结果:

   X1 X2 X3 A_13 B_11 B_12 B_13 C_11 C_13 D_12
1   a  j  Y   NA   NA   NA   NA   NA   NA  201
2   b  v  N   NA   NA   NA   NA  201   NA   NA
3   d  u  E   NA   NA   NA   NA  201   NA   NA
4   g  u  I  201   NA   NA   NA   NA   NA   NA
5   k  j  E   NA   NA   NA  201   NA   NA   NA
6   n  g  B   NA   NA  200   NA   NA   NA   NA
7   r  i  J   NA   NA  201   NA   NA   NA   NA
8   s  o  Y   NA   NA   NA   NA   NA  201   NA
9   w  n  E   NA  201   NA   NA   NA   NA   NA
10  y  a  U   NA   NA   NA   NA   NA   NA  200

顺便说一下,melt()dcast() 函数的增强版本也可以在 data.table 包中使用。