从表中计算概率

时间:2015-11-08 02:05:17

标签: r matrix

我有一个数据框如下:

current state   action  next state
w                 1      w
w                 1      w
w                 1      o
w                 1      o
o                 1      w

我想创建一个矩阵,通过执行action1来显示处于下一状态的概率是多少。 我想要的马提克如下:

          next.state
current    o    w  Sum
   w       0.5 0.5  1.00
   o       0   1.00 1.00

3 个答案:

答案 0 :(得分:3)

我认为一个好方法是使用CrossTable中的gmodels

library(gmodels)
tab <- CrossTable(df$current_state, df$next_state)

这将打印在屏幕上:

Total Observations in Table:  5 


                 | df$next_state 
df$current_state |         o |         w | Row Total | 
-----------------|-----------|-----------|-----------|
               o |         0 |         1 |         1 | 
                 |     0.400 |     0.267 |           | 
                 |     0.000 |     1.000 |     0.200 | 
                 |     0.000 |     0.333 |           | 
                 |     0.000 |     0.200 |           | 
-----------------|-----------|-----------|-----------|
               w |         2 |         2 |         4 | 
                 |     0.100 |     0.067 |           | 
                 |     0.500 |     0.500 |     0.800 | 
                 |     1.000 |     0.667 |           | 
                 |     0.400 |     0.400 |           | 
-----------------|-----------|-----------|-----------|
    Column Total |         2 |         3 |         5 | 
                 |     0.400 |     0.600 |           | 
-----------------|-----------|-----------|-----------|

您还可以通过以下方式获得概率:

tab <- CrossTable(df$current_state, df$next_state)$prop.row

> tab
   y
x     o   w
  o 0.0 1.0
  w 0.5 0.5

完成:

tab <- CrossTable(df$current_state, df$next_state)$prop.row
tab <- as.data.frame.matrix(tab)
tab$Sum <- rowSums(tab)

> tab
    o   w Sum
o 0.0 1.0   1
w 0.5 0.5   1

答案 1 :(得分:2)

试试这个(使用基础R):

dat <- data.frame(cur_state = c('w', 'w', 'w', 'w', 'o'), next_state = c('w', 'w', 'o', 'o', 'w'))
tmp <- table(dat[, 'cur_state'], dat[, 'next_state'])
tmp/rowSums(tmp)

#   o   w
# o 0.0 1.0
# w 0.5 0.5

答案 2 :(得分:1)

library(reshape2)

df <- dcast(df, 
            current_state ~ next_state, 
            fun.aggregate = length)

df[, 2:ncol(df)] <- df[, 2:ncol(df)] / rowSums(df[, 2:ncol(df)])
df$Sum <- rowSums(df[, 2:ncol(df)])