首页 > 解决方案 > 行和列中有多个项目的交叉表

问题描述

假设我有来自metric_1四个不同组(xi、和)调用的变量的平均值的数据delta,给出了一个名为 的新变量。数据如下所示。scenariomodelmean_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

我想使用列中的两个变量和行中的两个变量从这些信息中创建一个交叉表,如 object 所示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", "xi_2", "112.77091", "92.39346","116.78058", "105.06761", "157.78737", "80.42437"), 
               V4 = c("delta_1","xi_4", "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

标签: rdataframeaggregatecrosstabsummary

解决方案


您可以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直接使用只会给出组合的计数。请注意,这xtabssum重复组合。


推荐阅读