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 个变量的交叉表的主要内容,如果未能解决你的问题,请参考以下文章