以通用方式取消融化数据框
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}
你能帮我用 reshape
的 dcast()
函数实现这个吗?
感谢指点。
您可以 unite
X4
和 X5
列并使用 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
包中使用。
假设我有以下 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}
你能帮我用 reshape
的 dcast()
函数实现这个吗?
感谢指点。
您可以 unite
X4
和 X5
列并使用 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
包中使用。