建立一个矩阵,该矩阵计算1996年被评为i级,1997年被评为j级,1998年被评为k级的公司数量

时间:2018-10-30 16:04:56

标签: r matrix markov-chains

我正尝试使用一个函数来计算矩阵,该函数对1996年在“年份” i中“等级” i中的“ ID”的数量进行计数,然后在“年份” 1997中移至“等级” k,然后在1998年的“ YEAR”中移至“ RATING” k。

我相信矩阵的行标签将是“ RATING” i和“ RATING” j的组合,矩阵的列标签将是“ RATING” k。

每行的总和应为1996年“ RATING”的所有“ ID”和1997年“ RATING”的所有“ ID”的总和。

这是我的示例数据。

df <- rbind(df, data.frame("ID"=c('6387', '6387', '6387', '6403', '6403', '6403', '6408', '6408', '6408', '6411', '6411', '6411', '6413', '6413', '6413', '6422', '6422', '6422', '6427', '6427', '6427')))
df <- cbind(df, data.frame("YEAR"=c('1996', '1997', '1998', '1996', '1997', '1998', '1996', '1997', '1998', '1996', '1997', '1998', '1996', '1997', '1998', '1996', '1997', '1998', '1996', '1997', '1998')))
df <- cbind(df, data.frame("RATING"=c('Aa', 'Ba', 'Ba', 'B', 'Caa', 'Caa', 'A', 'Ba', 'Ba', 'B', 'Ba', 'B', 'B', 'Caa', 'Caa', 'B', 'B', 'B', 'Caa', 'B', 'Caa')))

使用@Muffindorf提供的代码:

df_long <- spread(df, YEAR, RATING)
df_long$c9697 <- paste(df_long$`1996`, df_long$`1997`, sep = '-')
as.matrix(table(df_long$c9697, df_long$`1998`))

给我:

       A Aa B Ba Caa
 A-Ba  0  0 0  1   0
 Aa-Ba 0  0 0  1   0
 B-B   0  0 1  0   0
 B-Ba  0  0 1  0   0
 B-Caa 0  0 0  0   2
 Caa-B 0  0 0  0   1

行标签告诉我们以前在1996年和1997年的等级,列标签告诉我们在1998年的等级,元素告诉我们转换后的ID数量。

我现在需要做的是让行标签是所有可能的等级组合,包括未观察到的。上面的代码仅产生观察到的组合的行标签。

1 个答案:

答案 0 :(得分:0)

这是您要寻找的吗?

library(tidyr)

df_long <- spread(df, YEAR, RATING)

df_long$c9697 <- paste(df_long$`1996`, df_long$`1997`, sep = '-')

as.matrix(table(df_long$c9697, df_long$`1998`))

当然,这并没有所有等级的组合,但是我想您可以手动添加它们