使用dplyr统计序列中状态A后接状态B的出现次数
基于tidyverse的状态转移次数统计方案
你需要统计的是相邻两期level的转移次数,核心逻辑是先匹配前一期和当期的level状态,再分组计数即可,具体实现如下:
代码实现
首先加载tidyverse包,导入你的示例数据:
library(tidyverse) df <- data.frame(value = c(130, 200, 240, 230, 130), level = c("below", "above","above","above", "below"))
基础计数实现
transition_counts <- df %>% # 生成上一期的level作为转移起始状态 mutate(from = lag(level)) %>% # 移除第一行(无上一期状态,无对应转移) drop_na(from) %>% # 当前level作为转移目标状态 rename(to = level) %>% # 按起始、目标状态分组统计次数 count(from, to, name = "transfer_count")
示例数据运行后输出结果如下:
from to transfer_count 1 above above 2 2 above below 1 3 below above 1
补全所有转移类型(包含0次的情况)
如果需要输出四类完整的转移结果(包含出现次数为0的below→below),可以增加补全逻辑:
full_transition <- transition_counts %>% complete(from = c("below", "above"), to = c("below", "above"), fill = list(transfer_count = 0))
运行后输出:
from to transfer_count 1 above above 2 2 above below 1 3 below above 1 4 below below 0
转换为宽格式转移矩阵
如果需要更直观的矩阵形式展示,可以进一步转换为宽表:
transition_matrix <- full_transition %>% pivot_wider(names_from = to, values_from = transfer_count)
运行后输出:
# A tibble: 2 × 3 from above below <chr> <dbl> <dbl> 1 above 2 1 2 below 1 0
至于你之前看到的sparseMatrix相关代码,只是稀疏矩阵的构造示例,没有结合你的实际数据逻辑,所以输出结果没有对应业务意义,无需纠结。
内容的提问来源于stack exchange,提问作者HCAI
相关产品推荐
相关产品推荐

