You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何统计状态转移?能否用纯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

代码解释

  1. 状态提取:用unique获取所有不重复的状态,再用sort排序,确保矩阵行列顺序和目标匹配;
  2. 矩阵初始化:创建一个与状态数量匹配的全0矩阵,通过dimnames设置行列名,方便直接用状态名定位;
  3. 循环统计:遍历每一对连续的状态,直接通过状态名找到矩阵中对应的位置,将计数加1,全程无需额外的数据框操作。

内容的提问来源于stack exchange,提问作者Werrby

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 04:45:55