过滤(时间相似)重复项,同时基于R中的另一列保持最大值

rta7y2nd  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(135)

我希望清理一个时间序列数据集,以便只保留每个事件的最大值。首先,我过滤了数据,以便只保留高于某个阈值的值,但仍然有一些值,虽然相隔一两毫秒,但作为重复值,但会在以后的分析中丢失。
我的初始数据集有> 100,000行和更多的列,但这里是一个较小版本的顶部。

head(shortfilter)
  Time (Sec) ECG (Channel 6)
1   5534.023        1.371761
2   5534.024        1.232424
3   5534.152        1.414432
4   5534.153        1.359914
5   5534.272        1.639033
6   5534.396        1.476161

字符串
解释:我没有一个具体的时间值,他们需要在它被认为是一个重复,但其余的数据是类似的,因为他们通常在0.003秒。

Time (Sec) ECG (Channel 6)
1   5534.023        1.371761 #<-- Higher value (keep)
2   5534.024        1.232424
3   5534.152        1.414432 #<-- Higher value (keep)
4   5534.153        1.359914
5   5534.272        1.639033 #<-- Only value (keep)
6   5534.396        1.476161 #<-- Only value (keep)


理想:

Time (Sec) ECG (Channel 6)
1   5534.023        1.371761
2   5534.152        1.414432
3   5534.272        1.639033
4   5534.396        1.476161
5   ____.___        _.______
6   ____.___        _.______


我将添加我的初步尝试在一些条件做什么我希望,但请记住,我是新的编码一般,所以我知道它不是远程正确,只是想得到一些想法在那里.希望它可以给给予一些额外的信息,我希望做什么虽然.我肯定的格式和语法是完全乱码,但我相信你们中的许多人会明白我是去哈哈...

for (i in shortfilter$`Time (Sec)`){
  for (j in shortfilter$`ECG (Channel 6)`){
    if ((i+1)-i > 0.01 && j > j+1){
      remove(j+1)
    } else if ((i+1)-i > 0.01 && j < j+1){
      remove(j)
    }
  }
}

k3bvogb1

k3bvogb11#

我的解决方案将每个值与下一个值进行比较,并找到差异,然后根据这些值调整预测的分组数。目前,它可以处理多达五个连续的重复数字,但如果您愿意,可以轻松添加更多。

library(tidyverse)

tibble::tribble(
   ~`Time`, ~`ECG`,
  5534.023, 1.371761,
  5534.024, 1.232424,
  5534.025, 1.27,
  5534.026, 1.28,
  5534.152, 1.414432,
  5534.153, 1.359914,
  5534.272, 1.639033,
  5534.396, 1.476161
  ) %>%
  arrange(Time) %>%
  mutate(sim_val = if_else(!is.na(lead(Time)), lead(Time) - Time, 5),
         Num = if_else(sim_val <= 0.03, row_number() + 1, as.numeric(row_number())),
         Num = if_else(sim_val <= 0.03 & Num < lead(Num), Num + 1, Num),
         Num = if_else(sim_val <= 0.03 & Num < lead(Num), Num + 1, Num),
         Num = if_else(sim_val <= 0.03 & Num < lead(Num), Num + 1, Num)) %>%
  arrange(Num, desc(ECG)) %>%
  group_by(Num) %>%
  slice_head(n = 1) %>%
  ungroup() %>%
  select(Time, ECG)

字符串
另外,请随时根据您的数据微调阈值0.03。如果有效,请告诉我!

相关问题