对数据框的特定行(数据块)进行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 种方法。
- 使用 group_split.
按组将数据帧分成数据帧列表
- 使用 purrr 包中的地图映射每个数据框。
- 将行绑定回普通数据框。
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
我有一个包含试验列、索引列和时间序列 (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 种方法。
- 使用 group_split. 按组将数据帧分成数据帧列表
- 使用 purrr 包中的地图映射每个数据框。
- 将行绑定回普通数据框。
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