2017-07-12 41 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

相关问题