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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 15:05:26