5 个变量的交叉表

Posted

技术标签:

【中文标题】5 个变量的交叉表【英文标题】:Cross Table of 5 Variables 【发布时间】:2021-09-17 10:30:39 【问题描述】:

我有一个 excel 数据集,其名称(变量)如下(来自数据的样本):

|Var1|Var2|Var3|Var4|Var5|
|0|0|0|0|0|
|0|0|0|0|1|
|0|0|0|0|2|
|0|0|0|1|0|

变量值如下: Var1 熊值 (0,1,2,3) Var2、Var3、Var4、Var5 熊值 (0,1,2) 我想构建包含所有可能值及其计数的交叉表,如下所示:

|Var1|Var2|Var3|Var4|Var5|count of similar event|
|0|0|0|0|0|0|
|0|0|0|0|1|0|
|0|0|0|0|2|0|
|0|0|0|1|0|1|
|0|0|0|1|1|1|
|0|0|0|1|2|0|
|0|0|0|2|0|6|

所以|0|0|0|0|0|永远不会出现,|0|0|0|2|0|出现 6 次(6 行)等等。

我尝试了以下函数表、交叉表和 xtab 但无法弄清楚。

【问题讨论】:

【参考方案1】:

这是一个基本的 R 方法。首先我们需要可重现的数据:

set.seed(42)
Var1 <- sample(0:3, 100, replace=TRUE)
Var2 <- sample(0:2, 100, replace=TRUE)
Var3 <- sample(0:2, 100, replace=TRUE)
Var4 <- sample(0:2, 100, replace=TRUE)
Var5 <- sample(0:2, 100, replace=TRUE)
Variables <- data.frame(Var1, Var2, Var3, Var4, Var5)
str(Variables)
# 'data.frame': 100 obs. of  5 variables:
#  $ Var1: int  0 0 0 0 1 3 1 1 0 3 ...
#  $ Var2: int  1 0 1 0 1 2 0 0 2 1 ...
#  $ Var3: int  2 1 1 2 2 0 2 1 0 2 ...
#  $ Var4: int  2 2 1 2 0 2 2 0 1 1 ...
#  $ Var5: int  1 1 0 1 0 2 0 1 1 2 ...

现在我们只需要创建一个多维表并将其展平即可:

Var.tbl <- xtabs(~Var1+Var2+Var3+Var4+Var5, Variables)
Var.dbf <- as.data.frame.table(Var.tbl)
head(Var.dbf)
#   Var1 Var2 Var3 Var4 Var5 Freq
# 1    0    0    0    0    0    0
# 2    1    0    0    0    0    0
# 3    2    0    0    0    0    0
# 4    3    0    0    0    0    1
# 5    0    1    0    0    0    0
# 6    1    1    0    0    0    2

这不是您在示例中使用的顺序。要获得该订单,请使用

Var.dbf2 <- with(Var.dbf, (Var.dbf[order(Var1, Var2, Var3, Var4, Var5), ]))
head(Var.dbf)
#   Var1 Var2 Var3 Var4 Var5 Freq
# 1    0    0    0    0    0    0
# 2    1    0    0    0    0    0
# 3    2    0    0    0    0    0
# 4    3    0    0    0    0    1
# 5    0    1    0    0    0    0
# 6    1    1    0    0    0    2

【讨论】:

【参考方案2】:

如果我理解正确

tidyverse

library(tidyverse)
df <- structure(
  list(
    Var1 = c(0L, 0L, 0L, 0L),
    Var2 = c(0L, 0L, 0L,
             0L),
    Var3 = c(0L, 0L, 0L, 0L),
    Var4 = c(0L, 0L, 0L, 1L),
    Var5 = c(0L,
             1L, 2L, 0L)
  ),
  class = "data.frame",
  row.names = c(NA,-4L)
)

vars <- syms(c("Var1", "Var2", "Var3", "Var4", "Var5"))

df %>% 
  group_by(!!!vars) %>% 
  add_count() %>% 
  complete(Var1 = 0:3, Var2 = 0:2, Var3 = 0:2, Var4 = 0:2, Var5 = 0:2, fill = list(n = 0)) %>% 
  ungroup()
#> # A tibble: 1,296 x 6
#>     Var1  Var2  Var3  Var4  Var5     n
#>    <int> <int> <int> <int> <int> <dbl>
#>  1     0     0     0     0     0     1
#>  2     0     0     0     0     1     1
#>  3     0     0     0     0     2     1
#>  4     0     0     0     1     0     1
#>  5     0     0     0     1     1     0
#>  6     0     0     0     1     2     0
#>  7     0     0     0     2     0     0
#>  8     0     0     0     2     1     0
#>  9     0     0     0     2     2     0
#> 10     0     0     1     0     0     0
#> # ... with 1,286 more rows

由reprex package (v2.0.0) 于 2021-07-06 创建

更新

df_count <- df %>% 
  group_by(!!!vars) %>% 
  add_count()

Var1 = 0:3
Var2 = 0:2
Var3 = 0:2
Var4 = 0:2
Var5 = 0:2

expand_grid(!!!vars) %>% 
  left_join(df_count) %>% 
  mutate(n = replace_na(n, 0))

【讨论】:

通过使用它构建了一个新的数据框。但是如果我想使用类似的结构来计算我的数据集事件呢?

以上是关于5 个变量的交叉表的主要内容,如果未能解决你的问题,请参考以下文章

实验8-SPSS交叉表分析

数据分析处理——透析表和交叉表

R中的条件交叉表

SQL Server:交叉引用一个表中的多个列与另一个表中的多个列

逻辑回归模型(二进制)交叉表错误 = 传递值的形状问题

模型比较的交叉验证