如何扩展 transition table 以包含所有可能的组合,甚至是那些未使用的组合?

How to expand transition table to include all possible combinations, even those unused combinations?

我正在为 运行ning 转换矩阵尝试 R 中的 table() 函数,到目前为止,我发现与我使用过的其他选项相比,它易于使用且速度非常快一直在玩 for-loops 和 lapply().

但是我想扩展输出 table 以包括所有可能的组合,即使它们没有出现在数据中,用 0 填充那些“未使用”的字段。有 quick/easy 的方法吗?

当我运行下面的例子数据框通过table()函数时,两者如下图:

  ID Period Balance Flags
1 10      1       5   X00
2 10      2      10   X01
3 10      3      15   X00
4 11      1       0   X01
5 11      2       2   X02
6 11      3       4   X02
7 15      1       3   X02
8 15      2       6   X01
9 15      3       2   X00

dataTest <- 
  data.frame(
    ID = c(10,10,10,11,11,11,15,15,15),
    Period = c(1, 2, 3, 1, 2, 3, 1, 2, 3),
    Balance = c(5, 10, 15, 0, 2, 4, 3, 6, 2),
    Flags = c("X00","X01","X00","X01","X02","X02","X02","X01","X00")
  )

table(dataTest[dataTest$Period == 3,]$Flags, dataTest[dataTest$Period == 1,]$Flags)

我得到以下结果(正确):

      X00 X01 X02
  X00   1   0   1
  X02   0   1   0

但是我想扩展这些结果以包括未使用的组合,所以它看起来像这样:

      X00 X01 X02
  X00   1   0   1
  X01   0   0   0
  X02   0   1   0

这是一个转换 table,沿列显示元素开始时的状态(根据此示例用户输入在 Period = 1 中)并沿行显示元素结束时的状态(在 Period 中= 3 每个此示例用户输入)。

library(tidyverse)

dataTest <-
  data.frame(
    ID = c(10, 10, 10, 11, 11, 11, 15, 15, 15),
    Period = c(1, 2, 3, 1, 2, 3, 1, 2, 3),
    Balance = c(5, 10, 15, 0, 2, 4, 3, 6, 2),
    Flags = c("X00", "X01", "X00", "X01", "X02", "X02", "X02", "X01", "X00")
  )

table(
  dataTest[dataTest$Period == 3, ]$Flags,
  dataTest[dataTest$Period == 1, ]$Flags
) %>%
  as.data.frame() %>%
  mutate(
    Var1 = Var1 %>% factor(levels = unique(dataTest$Flags)),
    Var2 = Var2 %>% factor(levels = unique(dataTest$Flags)),
  ) %>%
  complete(Var1, Var2, fill = list(Freq = 0)) %>%
  pivot_wider(names_from = Var2, values_from = Freq)
#> # A tibble: 3 × 4
#>   Var1    X00   X01   X02
#>   <fct> <int> <int> <int>
#> 1 X00       1     0     1
#> 2 X01       0     0     0
#> 3 X02       0     1     0

reprex package (v2.0.0)

创建于 2022-03-11