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

如何在R中计算纵向数据的平均时间间隔及测量次数统计

R语言处理纵向体重数据:相邻测量平均时间差与测量次数统计

假设你的数据框名为weight_data,包含字段:id(唯一参与者ID)、measure_date(测量日期)、weight(体重值,非必须)。以下是具体实现步骤:

一、数据预处理

首先确保日期格式正确,并按参与者ID和测量时间排序:

# 加载所需包
library(dplyr)
library(lubridate) # 可选,处理日期更便捷

# 转换日期格式(根据你的原始日期格式调整,比如ymd、dmy等)
weight_data <- weight_data %>%
  mutate(measure_date = ymd(measure_date)) %>%
  # 按ID和测量日期排序,确保每个参与者的测量顺序正确
  arrange(id, measure_date)

二、计算相邻测量的平均时间差

  1. 为每个参与者的测量排序,计算相邻时间差并标记间隔序号:
time_diff_data <- weight_data %>%
  group_by(id) %>%
  # 标记每个参与者的测量顺序(第1次、第2次...)
  mutate(measure_order = row_number()) %>%
  # 计算当前测量与上一次的时间差(单位:天)
  mutate(time_diff = as.numeric(measure_date - lag(measure_date), units = "days")) %>%
  # 标记间隔序号(第1-2次为1,第2-3次为2,以此类推)
  mutate(interval_num = measure_order - 1) %>%
  # 过滤掉无时间差的行(即第一次测量)
  filter(!is.na(time_diff))
  1. 按间隔序号计算平均时间差:
avg_time_diff <- time_diff_data %>%
  group_by(interval_num) %>%
  summarise(
    avg_days = mean(time_diff, na.rm = TRUE),
    sample_size = n() # 可选,统计该间隔的样本量
  )

# 查看结果
print(avg_time_diff)

三、统计不同测量次数的人数与占比

  1. 计算每个参与者的总测量次数:
count_data <- weight_data %>%
  group_by(id) %>%
  summarise(measure_count = n()) %>%
  ungroup()
  1. 对测量次数分组并统计人数、占比:
count_summary <- count_data %>%
  mutate(
    count_group = case_when(
      measure_count == 3 ~ "3次",
      measure_count == 4 ~ "4次",
      measure_count == 5 ~ "5次",
      measure_count == 6 ~ "6次",
      measure_count == 7 ~ "7次",
      measure_count >= 8 ~ "8次及以上",
      TRUE ~ "少于3次" # 可选,统计其他情况
    )
  ) %>%
  group_by(count_group) %>%
  summarise(person_count = n()) %>%
  mutate(percentage = round(person_count / sum(person_count) * 100, 2))

# 查看结果
print(count_summary)

大数据量优化(10万+参与者)

如果数据量极大,dplyr可能效率不足,推荐使用data.table包,速度更快:

library(data.table)

# 转换为data.table格式
setDT(weight_data)

# 预处理:转换日期、排序
weight_data[, measure_date := ymd(measure_date)]
setorder(weight_data, id, measure_date)

# 计算时间差与平均时间差
time_diff_data <- weight_data[, .(
  measure_order = .I,
  time_diff = as.numeric(measure_date - shift(measure_date), units = "days")
), by = id]
time_diff_data <- time_diff_data[!is.na(time_diff)]
time_diff_data[, interval_num := .I, by = id]
avg_time_diff <- time_diff_data[, .(avg_days = mean(time_diff), sample_size = .N), by = interval_num]

# 统计测量次数与占比
count_data <- weight_data[, .(measure_count = .N), by = id]
count_data[, count_group := fcase(
  measure_count == 3, "3次",
  measure_count == 4, "4次",
  measure_count == 5, "5次",
  measure_count == 6, "6次",
  measure_count == 7, "7次",
  measure_count >= 8, "8次及以上",
  default = "少于3次"
)]
count_summary <- count_data[, .(person_count = .N), by = count_group]
count_summary[, percentage := round(person_count / sum(person_count) * 100, 2)]

注意事项

  • 确保measure_date格式正确,若原始数据是字符型,需根据实际格式调整ymd()为dmy()或mdy()。
  • 如果存在同一参与者同一天多次测量的情况,可先通过distinct(id, measure_date)去重,或根据需求合并数据。
  • 计算时间差时,可根据需要调整单位(如"weeks"、"months"),修改as.numeric()的units参数即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 05:01:35