我有两个数据框x
和y
。我rbind
他们获得z
。然后我使用reshape
函数(不是包)来得到以下答案。
set.seed(1234)
x <- data.frame(rp=c(1:5),dmg=1000*runif(5), loss=500*runif(5), model="m1")
y <- data.frame(rp=c(1:5),dmg=1000*runif(5), loss=500*runif(5), model="m2")
z <- rbind(x, y)
> z
rp dmg loss model
1 113.7 320.2 m1
2 622.3 4.7 m1
3 609.3 116.3 m1
4 623.4 333.0 m1
5 860.9 257.1 m1
1 693.6 418.6 m2
2 545.0 143.1 m2
3 282.7 133.4 m2
4 923.4 93.4 m2
5 292.3 116.1 m2
> reshape(z, idvar="rp", timevar="model", direction="wide")
rp dmg.m1 loss.m1 dmg.m2 loss.m2
1 113.7 320.2 693.6 418.6
2 622.3 4.7 545.0 143.1
3 609.3 116.3 282.7 133.4
4 623.4 333.0 923.4 93.4
5 860.9 257.1 292.3 116.1
如何在 reshape2 中使用演员表/融合组合获得相同的结果?
答案 0 :(得分:1)
> dcast(melt(z, c("rp", "model")), rp ~ variable + model)
rp dmg_m1 dmg_m2 loss_m1 loss_m2
1 1 113.7034 693.5913 320.155303 418.64781
2 2 622.2994 544.9748 4.747878 143.11164
3 3 609.2747 282.7336 116.275253 133.41039
4 4 623.3794 923.4335 333.041879 93.36139
5 5 860.9154 292.3158 257.125571 116.11296
打破这种局面:首先使用melt
将其置于长形状中。但是,您不希望融合rp
和model
,因为这些将用于稍后识别行和列。
> my.df <- melt(z, c("rp", "model"))
> my.df
rp model variable value
1 1 m1 dmg 113.703411
2 2 m1 dmg 622.299405
3 3 m1 dmg 609.274733
4 4 m1 dmg 623.379442
5 5 m1 dmg 860.915384
6 1 m2 dmg 693.591292
7 2 m2 dmg 544.974836
8 3 m2 dmg 282.733584
9 4 m2 dmg 923.433484
10 5 m2 dmg 292.315840
11 1 m1 loss 320.155303
12 2 m1 loss 4.747878
13 3 m1 loss 116.275253
14 4 m1 loss 333.041879
15 5 m1 loss 257.125571
16 1 m2 loss 418.647814
17 2 m2 loss 143.111642
18 3 m2 loss 133.410390
19 4 m2 loss 93.361395
20 5 m2 loss 116.112955
然后使用dcast
将其转换为数据框。您希望rp
标识行,variable
和model
标识列,并使用公式表示。
> dcast(my.df, rp ~ variable + model)
rp dmg_m1 dmg_m2 loss_m1 loss_m2
1 1 113.7034 693.5913 320.155303 418.64781
2 2 622.2994 544.9748 4.747878 143.11164
3 3 609.2747 282.7336 116.275253 133.41039
4 4 623.3794 923.4335 333.041879 93.36139
5 5 860.9154 292.3158 257.125571 116.11296