【问题标题】:Cross Table of 5 Variables5 个变量的交叉表
【发布时间】: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 但无法弄清楚。

【问题讨论】:

    标签: r


    【解决方案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))
      

      【讨论】:

      • 通过使用它构建了一个新的数据框。但是如果我想使用类似的结构来计算我的数据集事件呢?
      猜你喜欢
      • 2014-09-29
      • 1970-01-01
      • 1970-01-01
      • 2015-10-08
      • 2019-06-19
      • 2020-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多