2017-07-12 18 views
0

我有一個約400個數據幀的列表,我想提取每個數據幀的功能。所有數據框的功能都是一樣的。我可以在r中的多個數據框列表中應用滑動窗口嗎?

數據幀包含來自加速計的信號,我將應用分類來識別不同的活動。由於我的課程是基於特定的模式,因此我需要基於窗口的功能(統計和頻域特徵)。

我可以直接進入數據框列表嗎?提取功能,然後將新功能列添加回每個數據幀的列表?

任何意見將不勝感激。我被卡住了。我知道如何在每個數據幀上執行此操作,但是使用這些數據幀會非常耗時。

列表例如

# Dataframes, x and y are accelerometer measurements and a is annotation 
df1 <- data.frame(x = runif(10), y = runif(10), a = sample(c(1,2), 10, replace = TRUE) 
df2 <- data.frame(x = runif(10), y = runif(10), a = sample(c(1,2), 10, replace = TRUE) 
lst <- list(df1, df2) 

該計劃是與許多功能對每個數據幀就結了,然後所有的dataframes融合在一起的特徵選擇,然後分類。

回答

1

zoo::rollapply()lapply()的組合應該有效。

set.seed(1) 
df1 <- data.frame(x = runif(10), 
        y = runif(10), 
        a = sample(c(1,2), 10, replace = TRUE)) 
df2 <- data.frame(x = runif(10), 
        y = runif(10), 
        a = sample(c(1,2), 10, replace = TRUE)) 
lst <- list(df1, df2) 

library(zoo) 

lst_w <- lapply(lst, function(x) { 
    cbind(x, a_w=rollapply(x$a, 3, mean, partial=TRUE)) 
    }) 

這將添加一個(平均值)窗口版本a列的各數據幀。

lapply(lst_w, head, 3) 
# [[1]] 
      # x   y a  a_w 
# 1 0.2655087 0.2059746 2 1.500000 
# 2 0.3721239 0.1765568 1 1.666667 
# 3 0.5728534 0.6870228 2 1.333333 

# [[2]] 
      # x   y a  a_w 
# 1 0.4820801 0.8209463 1 1.500000 
# 2 0.5995658 0.6470602 2 1.333333 
# 3 0.4935413 0.7829328 1 1.333333 

你可以用你想要的任何函數代替rollapply()調用中的平均值。

+0

謝謝阿克塞爾,我試了一下,這就是我想要的。我不確定這是否可行。我擔心我不得不將所有的數據框取消清單,然後對每個數據框進行處理。 – nkl1

相關問題