首页 > 解决方案 > 使用“table”函数在 R 中创建转换矩阵

问题描述

我有一个包含 4 列的数据框:期间、ID、当前期间的类别、下一期间的类别。

period <- c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2)
ID <- c('a12', 'a123', 'a1234', 'a12345', 'b12', 'b123', 'b1234', 'b12345', 'c12', 'c123')
category_t0 <- c(1, 2, 3, 4, 1, 1, 1, 2, 3, 5, 1, 3, 2, 5, 1, 1, 2, 3, 4, 1)
category_t1 <- c(1, 3, 2, 5, 1, 1, 2, 3, 4, 'NA', 'NA', 'NA', 'NA', 'NA', 'NA', 'NA', 'NA', 'NA', 'NA', 'NA')
df <- data.frame(period, ID, category_t0, category_t1)

我需要为每个时期创建单独的转换矩阵。我试图使用“表格”功能,但无法弄清楚如何在某个条件下写入以使用某个时间段。以下代码考虑了数据框中的所有观察结果,而我只需要采用“周期 == 1”的值。

trans_1to2 = table(df$category_t0, df$category_t1, useNA = c("ifany"))
matrix_1to2 = trans_1to2 / rowSums(trans_1to2)
print(matrix_1to2)

我想要的第 1 阶段的输出应该是这样的。

有人可以分享这方面的想法吗?此外,真实数据有 50 个周期,所以我需要创建 50 个不同的转换矩阵。最好的方法是什么(例如使用循环)?

谢谢!

标签: rmatrix

解决方案


您可以使用 in 进行子集dfdf$period==1[获取第 1 期的表格。

trans_1to2 = table(df[df$period==1, 3:4])
trans_1to2 / rowSums(trans_1to2)
#           category_t1
#category_t0    1    2    3    4    5   NA
#          1 0.75 0.25 0.00 0.00 0.00 0.00
#          2 0.00 0.00 1.00 0.00 0.00 0.00
#          3 0.00 0.50 0.00 0.50 0.00 0.00
#          4 0.00 0.00 0.00 0.00 1.00 0.00
#          5 0.00 0.00 0.00 0.00 0.00 1.00

要使其适用于多个时期,只需将时期也添加到table

trans_1to2 <- table(df[c(3,4,1)])
matrix_1to2 <- proportions(trans_1to2, c(1,3))

matrix_1to2[,,1] #Get first period
#           category_t1
#category_t0    1    2    3    4    5   NA
#          1 0.75 0.25 0.00 0.00 0.00 0.00
#          2 0.00 0.00 1.00 0.00 0.00 0.00
#          3 0.00 0.50 0.00 0.50 0.00 0.00
#          4 0.00 0.00 0.00 0.00 1.00 0.00
#          5 0.00 0.00 0.00 0.00 0.00 1.00

matrix_1to2[,,2] #Get second period
#           category_t1
#category_t0 1 2 3 4 5 NA
#          1 0 0 0 0 0  1
#          2 0 0 0 0 0  1
#          3 0 0 0 0 0  1
#          4 0 0 0 0 0  1
#          5 0 0 0 0 0  1

推荐阅读