如何解决以通用方式解散数据框
假设我有以下 data.frame
library(reshape2)
set.seed(1)
dat = data.frame(X1 = sample(letters,10,replace = T),X2 = sample(letters,X3 = sample(LETTERS,X4 = sample(LETTERS[1:4],X5 = sample(11:13,X6 = sample(200:201,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}
能否请您帮我使用 dcast()
中的 reshape
函数来实现此目的?
感谢您的指点。
解决方法
dcast()
的转换公式允许使用一个特殊变量 ...
,它代表公式中未使用的所有其他变量。所以,
library(reshape2)
dcast(dat,... ~ X4 + X5,value.var = "X6")
应该返回预期的结果:
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
包中使用。
您可以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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。