对数据框的特定行(数据块)进行Filtfilt

Filtfilt on specific rows (data blocks) of data frame

我有一个包含试验列、索引列和时间序列 (Fy) 数据列的数据框。我想在每个试验中独立使用 filtfilt(),结果将是过滤了时间序列数据列的原始数据框。

示例数据集 (df):

Trial Index Fy
1 1 1.3
1 2 1.4
1 3 1.5
1 4 1.6
2 5 2.4
2 6 2.5
2 7 2.6
2 8 2.7

我的过滤器(来自信号包):

bf <- butter(4, 30/(1000/2), type="low") 

我可以在完整的专栏上使用 filtfilt(),例如:

df$Fy <- filtfilt(bf, df$Fy)

但是,这不允许过滤器识别它们是列中的不同试验,并且每个试验都需要单独过滤。

我试过:

df %>%
group_by(Trial) %>%
filtfilt(bf, df$Fy) #filters specific data column

然后我尝试通过试验创建索引列表:

index <- df %>%
  group_by(Trial) %>%
  summarise(Indices = paste(sort(unique(Index)), collapse = " "))

并尝试 lapply 我要筛选的特定列:

df$Fy <- lapply(index, function(x) filtfilt(bf, x))

这是 1 种方法。

  1. 使用 group_split.
  2. 按组将数据帧分成数据帧列表
  3. 使用 purrr 包中的地图映射每个数据框。
  4. 将行绑定回普通数据框。
library(dplyr)
library(signal)
library(purrr)

df<-tibble::tribble(
      ~Trial, ~Index, ~Fy,
          1L,     1L, 1.3,
          1L,     2L, 1.4,
          1L,     3L, 1.5,
          1L,     4L, 1.6,
          2L,     5L, 2.4,
          2L,     6L, 2.5,
          2L,     7L, 2.6,
          2L,     8L, 2.7
      )

bf <- butter(4, 30/(1000/2), type="low") 

apply_my_filter<-function(df){
 df$Fy <- filtfilt(bf, df$Fy)
 return(df)
}

df_filtered<-df %>%
  group_split(Trial) %>%
  map(apply_my_filter) %>%
  bind_rows()

df_filtered
#> # A tibble: 8 × 3
#>   Trial Index     Fy
#>   <int> <int>  <dbl>
#> 1     1     1 0.0884
#> 2     1     2 0.0777
#> 3     1     3 0.0662
#> 4     1     4 0.0544
#> 5     2     5 0.156 
#> 6     2     6 0.137 
#> 7     2     7 0.117 
#> 8     2     8 0.0962

reprex package (v2.0.1)

创建于 2022-01-09