问题描述
假设我有来自四个不同组(metric_1
、xi
、delta
和 scenario
)平均一个名为 model
的变量的数据,给出一个名为 mean_metric1
的新变量。数据如下所示。
set.seed(777)
xi = c(2,4 )
delta = c( 0.5,1 )
scenario = c("scenario_1","scenario_2")
model <- c("model_1","model_2","model_3")
df <- expand.grid(xi = xi,delta = delta,scenario = scenario,model = model)
df$mean_metric1 <- rnorm(nrow(df),100,25)
xi delta scenario model mean_metric1
1 2 0.5 scenario_1 model_1 112.24466
2 4 0.5 scenario_1 model_1 90.03647
3 2 1.0 scenario_1 model_1 112.77091
4 4 1.0 scenario_1 model_1 90.02970
5 2 0.5 scenario_2 model_1 140.96715
6 4 0.5 scenario_2 model_1 115.53185
7 2 1.0 scenario_2 model_1 105.06761
8 4 1.0 scenario_2 model_1 127.72344
9 2 0.5 scenario_1 model_2 94.84438
10 4 0.5 scenario_1 model_2 90.52587
11 2 1.0 scenario_1 model_2 92.39346
12 4 1.0 scenario_1 model_2 101.35406
13 2 0.5 scenario_2 model_2 52.97673
14 4 0.5 scenario_2 model_2 99.15609
15 2 1.0 scenario_2 model_2 157.78737
16 4 1.0 scenario_2 model_2 124.30850
17 2 0.5 scenario_1 model_3 124.11520
18 4 0.5 scenario_1 model_3 86.39669
19 2 1.0 scenario_1 model_3 116.78058
20 4 1.0 scenario_1 model_3 112.52047
21 2 0.5 scenario_2 model_3 49.23410
22 4 0.5 scenario_2 model_3 105.69380
23 2 1.0 scenario_2 model_3 80.42437
24 4 1.0 scenario_2 model_3 131.83980
我想使用列中的两个变量和行中的两个变量根据这些信息创建一个交叉表,如对象 wanted
所示。
wanted <- structure(list(V1 = c("delta_0.5","xi_2","112.24466","94.84438","124.1152","140.96715","52.97673","49.2341"),V2 = c("delta_0.5","xi_4","90.03647","90.52587","86.39669","115.53185","99.15609","105.6938"),V3 = c("delta_1","112.77091","92.39346","116.78058","105.06761","157.78737","80.42437"),V4 = c("delta_1","90.0297","101.35406","112.52047","127.72344","124.3085","131.8398")),class = "data.frame",row.names = c(" ","","model_1_scenario_1","model_2_scenario_1","model_3_scenario_1","model_1_scenario_2","model_2_scenario_2","model_3_scenario_2"))
V1 V2 V3 V4
delta_0.5 delta_0.5 delta_1 delta_1
xi_2 xi_4 xi_2 xi_4
model_1_scenario_1 112.24466 90.03647 112.77091 90.0297
model_2_scenario_1 94.84438 90.52587 92.39346 101.35406
model_3_scenario_1 124.1152 86.39669 116.78058 112.52047
model_1_scenario_2 140.96715 115.53185 105.06761 127.72344
model_2_scenario_2 52.97673 99.15609 157.78737 124.3085
model_3_scenario_2 49.2341 105.6938 80.42437 131.8398
解决方法
您可以将 ftable
与 xtabs
结合使用:
ftable(xtabs(mean_metric1 ~ scenario + model + xi + delta,df),col.vars=3:4)
xi 2 4
delta 0.5 1 0.5 1
scenario model
scenario_1 model_1 112.24466 112.77091 90.03647 90.02970
model_2 94.84438 92.39346 90.52587 101.35406
model_3 124.11520 116.78058 86.39669 112.52047
scenario_2 model_1 140.96715 105.06761 115.53185 127.72344
model_2 52.97673 157.78737 99.15609 124.30850
model_3 49.23410 80.42437 105.69380 131.83980
xtabs
是必需的,因为直接使用 ftable
只会给出组合的计数。请注意,xtabs
将 sum
重复组合。