我有一个数据框如下:
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
答案 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)])