【问题标题】:Creating a symmetric frequency table in R在 R 中创建对称频率表
【发布时间】:2020-06-22 14:21:39
【问题描述】:

我有一个我认为应该是微不足道的问题,但我想不出一个优雅的解决方案(或使用正确的函数)。

假设我有一个包含两个因子变量的数据框,我想计算它们的共现情况。这应该很容易:

require(tidyverse)
set.seed(5)
example <- tibble(
  Var_1 = sample(letters[1:5], 50, replace = TRUE),
  Var_2 = sample(letters[1:4], 50, replace = TRUE)
)

table(example)

输出是:

     Var_2
  Var_1 a b c d
      a 4 0 2 1
      b 3 4 2 3
      c 3 4 0 6
      d 3 5 2 0
      e 1 0 3 4

但是,由于Var_1 中的独特因子比Var_2 中的多,因此该表是不对称的,在这种情况下54 是不对称的。我将如何强制表格对称并在两个维度上使用更长的唯一因子向量?

即,在此示例中,55 表是这样的:

     Var_2
  Var_1 a b c d e
      a 4 0 2 1 0
      b 3 4 2 3 0
      c 3 4 0 6 0
      d 3 5 2 0 0
      e 1 0 3 4 0

我唯一能想到的就是手动检查Var_1 中的哪些条目没有出现在Var_2 中并附加一列零,但也许有更好的解决方案?谢谢。

【问题讨论】:

    标签: r


    【解决方案1】:

    example 转换为factors,所有列都使用相同的levels

    all_vec <- sort(unique(unlist(example)))
    example[] <- lapply(example, factor, levels = all_vec)
    table(example)
    
    #     Var_2
    #Var_1 a b c d e
    #    a 4 0 2 1 0
    #    b 3 4 2 3 0
    #    c 3 4 0 6 0
    #    d 3 5 2 0 0
    #    e 1 0 3 4 0
    

    如果您想要tidyverse 答案:

    library(dplyr)
    library(tidyr)
    
    example %>%
      mutate(across(everything(), factor, levels = all_vec)) %>%
      count(Var_1, Var_2, .drop = FALSE) %>%
      pivot_wider(names_from = Var_1, values_from = n, values_fill = list(n = 0))
    

    【讨论】:

      【解决方案2】:

      xtabs 的选项来自base R

      xtabs(val ~ ., cbind(transform(example, Var_2 = factor(Var_2, levels = letters[1:5])), val = 1))
      #     Var_2
      #Var_1 a b c d e
      #    a 4 0 2 1 0
      #    b 3 4 2 3 0
      #    c 3 4 0 6 0
      #    d 3 5 2 0 0
      #    e 1 0 3 4 0
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-13
        • 1970-01-01
        • 2016-05-12
        • 2021-11-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多