【问题标题】:How do you use map() to apply function to data frame, when function calls for specific column input in R?当函数调用 R 中的特定列输入时,如何使用 map() 将函数应用于数据框?
【发布时间】:2021-03-06 23:40:21
【问题描述】:

我的目标是将小波分析和图像构造应用于时间序列数据的大型数据集,最终用于时间序列聚类的管道。第一步的函数来自 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 命令正在寻找要指定的单个列。有没有办法通知命令连续取下一列?

【问题讨论】:

    标签: r function time-series tidyverse wavelet-transform


    【解决方案1】:

    你可以编写一个函数,它接受两个输入,数据框和列名/位置。

    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 只有一列用于分析时,这段代码对我来说既有效又有意义。但是,如果 df 有多个具有自己的时间序列的列,则会在 analyze.wavelet(my.data = df, my.series = col, loess.span = 0, 中抛出 错误:请选择(仅)一个用于分析的系列! 错误。有没有办法调整它以迭代每一列?
    • @Tom 我不确定你在问什么。我们使用names(df)seq_along(df) 遍历每一列。输出列表存储在result 中。我认为你应该把这个作为一个新问题来问。
    【解决方案2】:

    看起来 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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-17
      • 1970-01-01
      • 1970-01-01
      • 2020-05-24
      • 1970-01-01
      • 2023-03-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多