如何将R中data.frame调整为每秒一条心率数据的格式
R语言特殊格式心率数据转换及缺失值统计方案
依赖包
使用tidyverse系列工具包完成数据处理和时间格式操作,加载代码如下:
# 首次使用先安装依赖 install.packages(c("tidyverse", "lubridate")) # 加载工具包 library(tidyverse) library(lubridate)
核心处理逻辑
1. 数据格式转换(转为每秒1行的标准格式)
针对原始数据的错位规则:第n行的duration字段对应第n-1行heart_rate的持续秒数,先调整duration匹配对应心率,再按持续时间展开为每秒一条数据,统一duration为1,代码如下:
# 构造示例原始数据,实际使用时替换为你自己的数据集导入代码 raw_data <- tibble( duration = c(1,1,2,4,2,6,2,5,4,2), heart_rate = c(74,74,71,71,72,72,74,76,75,75), startdate = ymd_hms(c( "2021-09-06 07:25:33", "2021-09-06 07:25:34", "2021-09-06 07:25:36", "2021-09-06 07:25:40", "2021-09-06 07:25:42", "2021-09-06 07:25:48", "2021-09-06 07:25:50", "2021-09-06 07:25:55", "2021-09-06 07:25:59", "2021-09-06 07:26:01" )) ) # 转换为目标格式 standard_hr_data <- raw_data %>% # 修正duration匹配规则:下一行的duration为当前行心率的持续时间,最后一行默认用自身duration mutate(actual_duration = lead(duration, default = last(duration))) %>% # 按持续时间生成每秒时间戳并展开为多行 rowwise() %>% mutate(startdate = list(seq(startdate, by = "sec", length.out = actual_duration))) %>% unnest(startdate) %>% # 统一duration为1,保留目标字段 mutate(duration = 1) %>% select(duration, heart_rate, startdate)
运行后standard_hr_data即为你需要的每秒一条的标准格式数据。
2. 缺失数据统计
先生成覆盖整个统计时间段的完整每秒时间序列,和转换后的心率数据关联后即可定位缺失值:
# 生成覆盖全时间段的完整时间序列 full_time_seq <- tibble( startdate = seq(min(standard_hr_data$startdate), max(standard_hr_data$startdate), by = "sec") ) # 关联得到带缺失标记的完整数据集 full_hr_data <- full_time_seq %>% left_join(standard_hr_data, by = "startdate") %>% mutate(duration = replace_na(duration, 1)) # 统计连续缺失的时间段和缺失秒数 missing_stats <- full_hr_data %>% # 标记缺失行 mutate(is_missing = is.na(heart_rate)) %>% # 对连续缺失的行分组 mutate(missing_group = cumsum(is_missing != lag(is_missing, default = FALSE))) %>% filter(is_missing) %>% group_by(missing_group) %>% summarise( missing_start = min(startdate), missing_end = max(startdate), missing_seconds = n() ) %>% ungroup() %>% select(-missing_group)
运行后missing_stats会输出所有连续缺失的开始时间、结束时间和对应的缺失秒数。
内容的提问来源于stack exchange,提问作者GZM97
相关产品推荐
相关产品推荐

