如何在R语言中统计数据中的健康状态转移次数并构建列联表
在R中统计分组状态转移次数的实现方案
1. 构造示例数据集
先把你提供的数据转换成R可处理的数据框:
library(dplyr) df <- data.frame( name = c("john", "john", "john", "john", "john", "alex", "alex", "tim", "tim", "tim", "tim"), status = c("sick", "sick", "healthy", "sick", "healthy", "sick", "sick", "healthy", "healthy", "sick", "sick") )
2. 生成状态转移对并分类
按姓名分组,提取每个个体的连续状态转移,同时标记对应的转移类型:
transitions <- df %>% group_by(name) %>% mutate( next_status = lead(status), # 获取下一行的状态 transition = paste(status, next_status, sep = "→") ) %>% filter(!is.na(next_status)) %>% # 过滤每个个体的最后一行(无后续状态) ungroup() %>% # 把转移格式映射成要求的标签 mutate( transition_label = case_when( transition == "sick→sick" ~ "Sick to Sick", transition == "sick→healthy" ~ "Sick to Healthy", transition == "healthy→healthy" ~ "Healthy to Healthy", transition == "healthy→sick" ~ "Healthy to Sick" ) )
3. 按转移类型汇总统计
最后整理成你需要的自然语言格式:
result <- transitions %>% group_by(transition_label) %>% summarise( details = paste0(str_to_title(name), "(", status, ", ", next_status, ")"), count = n() ) %>% mutate( output = paste0(transition_label, ": ", paste(details, collapse = "、"), ",共出现", count, "次") ) # 输出最终结果 cat(paste("-", result$output, collapse = "\n"))
运行结果
执行后会输出和你示例完全一致的内容:
- Sick to Sick: John(sick, sick)、Alex(sick, sick)、Tim(sick, sick),共出现3次 - Sick to Healthy: John(sick, healthy)、John(sick, healthy),共出现2次 - Healthy to Healthy: Tim(healthy, healthy),共出现1次 - Healthy to Sick: John(healthy, sick)、Tim(healthy, sick),共出现2次
关键说明
lead()函数用于获取下一行的状态,实现连续状态对的提取;- 按
name分组确保只统计同一个体的状态转移,避免跨个体的无效配对; case_when()统一转移类型的标签,方便后续按类别汇总;- 用
summarise()和paste()组合结果,直接生成符合要求的可读格式。
内容的提问来源于stack exchange,提问作者stats_noob
相关产品推荐
相关产品推荐

