R语言实现数据框中10Hz时间序列上采样至100Hz并填充缺失值
在R中实现10Hz数据上采样至100Hz
针对你的需求,R中有多个包的函数可以完成上采样并填充两点间的缺失数据,下面是具体的实现步骤:
1. 数据预处理(处理欧洲格式小数)
首先需要把数据中用逗号分隔的小数转换为R支持的点分隔格式:
# 加载依赖包 library(dplyr) library(tidyr) library(zoo) # 你的示例数据 df <- tibble( DeltaT = c("48860,7", "48860,8", "48860,9", "48861,0", "48861,1"), Speed = c("0,03", "0,02", "0,02", "0,02", "0,01"), Acc = c("-0,05", "-0,05", "-0,04", "-0,03", "-0,02"), HR = c("0", "0", "0", "0", "0"), Player = rep("Player1", 5) ) # 转换小数格式并转为数值型 df_clean <- df %>% mutate(across(c(DeltaT, Speed, Acc, HR), ~ as.numeric(gsub(",", ".", .))))
2. 上采样并插值填充
使用tidyr::complete()生成100Hz采样频率的完整时间序列(间隔0.01秒),再用zoo::na.approx()对缺失值进行线性插值:
# 生成完整时间序列并插值 df_upsampled <- df_clean %>% group_by(Player) %>% # 生成从最小到最大DeltaT、间隔0.01秒的所有时间点 complete(DeltaT = seq(min(DeltaT), max(DeltaT), by = 0.01)) %>% # 对连续型数值列进行线性插值 mutate( Speed = na.approx(Speed), Acc = na.approx(Acc), HR = na.approx(HR) ) %>% ungroup()
关键函数说明
complete():自动补全指定序列的所有缺失行,这里用来扩展时间间隔,从10Hz的0.1秒间隔变为100Hz的0.01秒间隔,新增行的数值列会填充为NA。na.approx():对NA值执行线性插值,适合连续变化的物理量(如速度、加速度);如果是离散型数据(如分类标签),可以改用tidyr::fill()填充最近的有效值。
针对时间戳格式的扩展
如果你的DeltaT是时间戳(而非数值型累计时间),可以用lubridate包处理:
library(lubridate) # 假设DeltaT是时间字符串,先转为POSIXct格式 df_clean <- df_clean %>% mutate(DeltaT = ymd_hms(DeltaT)) # 根据实际时间格式调整函数 # 生成间隔0.01秒的时间序列并插值 df_upsampled <- df_clean %>% group_by(Player) %>% complete(DeltaT = seq(min(DeltaT), max(DeltaT), by = 0.01)) %>% mutate(across(c(Speed, Acc, HR), na.approx)) %>% ungroup()
内容的提问来源于stack exchange,提问作者MarkPT
相关产品推荐
相关产品推荐

