如何扩展 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
我正在为 运行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