当函数调用 R 中的特定列输入时,如何使用 map() 将函数应用于数据框?

How do you use map() to apply function to data frame, when function calls for specific column input in R?

我的目标是将小波分析和图像构建应用于时间序列数据的大型数据集,最终用于时间序列聚类的管道。执行第一步的函数来自 WaveletComp,我使用的是 Tidyverse 包中的 purr map ()。理想情况下,输出是为每一列标记的列表,然后我可以在管道中应用其他函数。

library(WaveletComp)

The data set has 3 columns and 6000 values

df <- data.frame(replicate(3,sample(-5:5,6000,rep=TRUE)))

wave_emg <- function(df) {
  analyze.wavelet(my.data = df, my.series = "X1", loess.span =50,
                        dt=1, dj=1/250,
                        lowerPeriod = 32,
                        upperPeriod = 512,
                        make.pval = TRUE, n.sim = 100)

Solution <- mutate(model = map(df, wave_emg))

我收到以下错误 *my.data[ ind] 错误:维数不正确

在我看来,analyze.wavelet 函数中的 my.series 命令正在寻找要指定的单个列。有没有办法通知命令依次取下一列?

您可以编写一个接受两个输入、数据框和列的函数 name/position。

library(WaveletComp)
library(purrr)

ave_emg <- function(df, col) {
  analyze.wavelet(my.data = df, my.series = col, loess.span =50,
                  dt=1, dj=1/250,
                  lowerPeriod = 32,
                  upperPeriod = 512,
                  make.pval = TRUE, n.sim = 100)
}

analyze.wavelet 函数将列名或列索引作为输入,因此您可以使用以下任何版本:

#column names
result <- map(names(df), ave_emg, df = df)
#column index
result <- map(seq_along(df), ave_emg, df = df)

您也可以将 map 替换为 lapply 以获得相同的输出。

看来df在进入函数前需要先拆分,以免出现'analyze.wavlet()的错误'.此代码似乎适用于此功能,但您@Ronak 代码适用于其他功能。

    library(tidyverse)
    library(WaveletComp)

wave_emg <- function(df) {
  analyze.wavelet(my.data = df, my.series = "X1", loess.span =50,
                        dt=1, dj=1/250,
                        lowerPeriod = 32,
                        upperPeriod = 512,
                        make.pval = TRUE, n.sim = 100
    
    Solution <- df %>% split.default(.,seq_along(.)) %>% map(., ave_emg)