如何统计状态转移?能否用纯for循环实现状态转移矩阵统计
纯For循环实现状态转移矩阵统计
问题描述
给定如下序列:
M M D M D S M K M
需要通过遍历每一行统计状态转移组合,生成目标状态转移矩阵:
M D S K M 1 2 0 1 D 1 0 1 0 S 1 0 0 0 K 1 0 0 0
此前找到的实现方法依赖expand.grid函数:
result <- expand.grid(unique(my.vec), unique(my.vec)) %>% mutate(count = 0) for (i in 1:(length(my.vec)-1)){ currentVal = my.vec[i] nextVal = my.vec[i+1] result[result$Var1 == currentVal & result$Var2==nextVal,]$count = result[result$Var1 == currentVal & result$Var2==nextVal,]$count +1 }
请问能否仅用纯For循环实现该需求?
纯For循环解决方案
完全可以,核心步骤是先确定所有唯一状态,初始化全0矩阵,再通过循环遍历连续状态对完成计数累加。
实现代码
# 定义原始序列 my.vec <- c("M", "M", "D", "M", "D", "S", "M", "K", "M") # 获取有序的唯一状态集合(保证矩阵行列顺序与目标一致) states <- sort(unique(my.vec)) # 初始化全0转移矩阵,设置行列名为状态值 trans_matrix <- matrix( data = 0, nrow = length(states), ncol = length(states), dimnames = list(states, states) ) # 纯For循环统计转移次数 for (i in 1:(length(my.vec) - 1)) { current_state <- my.vec[i] next_state <- my.vec[i + 1] # 定位矩阵位置并累加计数 trans_matrix[current_state, next_state] <- trans_matrix[current_state, next_state] + 1 } # 输出结果 print(trans_matrix)
输出结果
运行代码后会得到与需求完全一致的矩阵:
M D S K M 1 2 0 1 D 1 0 1 0 S 1 0 0 0 K 1 0 0 0
代码解释
- 状态提取:用
unique获取所有不重复的状态,再用sort排序,确保矩阵行列顺序和目标匹配; - 矩阵初始化:创建一个与状态数量匹配的全0矩阵,通过
dimnames设置行列名,方便直接用状态名定位; - 循环统计:遍历每一对连续的状态,直接通过状态名找到矩阵中对应的位置,将计数加1,全程无需额外的数据框操作。
内容的提问来源于stack exchange,提问作者Werrby
相关产品推荐
相关产品推荐

