如何在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)
二、计算相邻测量的平均时间差
- 为每个参与者的测量排序,计算相邻时间差并标记间隔序号:
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))
- 按间隔序号计算平均时间差:
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)
三、统计不同测量次数的人数与占比
- 计算每个参与者的总测量次数:
count_data <- weight_data %>% group_by(id) %>% summarise(measure_count = n()) %>% ungroup()
- 对测量次数分组并统计人数、占比:
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
相关产品推荐
相关产品推荐

