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

R语言计算分箱生理时间序列各分箱停留时长:以MAP数据为例

解法说明

你的数据为每分钟1条的时间序列,每条记录对应1分钟的观测时长,因此直接按受试者ID和MAP分箱分组统计记录数,即可得到对应分箱的总停留时长。基于你现有的dplyr代码,使用add_count()函数即可快速实现需求,完整代码如下:

library(dplyr)

# 示例数据
df=structure(list(ID = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 
                            2L, 2L, 2L, 2L, 2L), Time = structure(1:14, .Label = c("11:02:00", 
                                                                                   "11:03:00", "11:04:00", "11:05:00", "11:06:00", "11:07:00", "11:08:00", 
                                                                                   "13:30:00", "13:31:00", "13:32:00", "13:33:00", "13:34:00", "13:35:00", 
                                                                                   "13:36:00"), class = "factor"), MAP = c(90.27999878, 84.25, 74.81999969, 
                                                                                                                           80.87000275, 99.38999939, 81.51000214, 71.51000214, 90.08999634, 
                                                                                                                           88.75, 84.72000122, 83.86000061, 94.18000031, 98.54000092, 51
                                                                                   )), class = "data.frame", row.names = c(NA, -14L))

# 分箱+计算停留时长
map_bin=c("1","2","3")
output <- as_tibble(df) %>% 
  # 可选:将时间列转为标准时间格式,方便后续拓展处理
  mutate(Time = as.POSIXct(Time, format = "%H:%M:%S")) %>%
  # MAP分箱
  mutate(map_bin = case_when(
    MAP >= 40 & MAP < 60 ~ map_bin[1],
    MAP >= 60 & MAP < 80 ~ map_bin[2],
    MAP >= 80 & MAP < 100 ~ map_bin[3]
  )) %>%
  # 按ID和分箱分组计数,得到总停留时长(单位:分钟)
  add_count(ID, map_bin, name = "map_bin_dur")

如果你的实际数据存在时间间隔不是1分钟的情况,可使用时间差计算总时长,代码如下:

library(dplyr)

output <- as_tibble(df) %>% 
  mutate(Time = as.POSIXct(Time, format = "%H:%M:%S")) %>%
  mutate(map_bin = case_when(
    MAP >= 40 & MAP < 60 ~ map_bin[1],
    MAP >= 60 & MAP < 80 ~ map_bin[2],
    MAP >= 80 & MAP < 100 ~ map_bin[3]
  )) %>%
  arrange(ID, Time) %>%
  # 计算单条记录的持续时长
  group_by(ID) %>%
  mutate(single_dur = as.numeric(difftime(lead(Time), Time, units = "mins"))) %>%
  # 补全最后一条记录的时长,可根据实际需求调整
  mutate(single_dur = ifelse(is.na(single_dur), 1, single_dur)) %>%
  # 按ID和分箱求和得到总停留时长
  group_by(ID, map_bin) %>%
  mutate(map_bin_dur = sum(single_dur)) %>%
  ungroup() %>%
  select(-single_dur)

上述第一种代码运行后得到的结果和你给出的期望输出完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 06:18:01