有没有办法以窗口滑动的形式选择数据?

Is there a way to select data in a form of windows sliding?

提问人:cidc12 提问时间:11/17/2023 最后编辑:Markcidc12 更新时间:11/19/2023 访问量:27

问:

我想使用主数据集中 5 的滑动窗口生成一个包含五列的新数据。

我想要的输出 resluts:

dataset     
disp1   disp2   disp3
-2.5    -4.8    -1.4
1.3 0.6 3.1
-1.7    -6.4    -1.7
-8.9    9.7 -5.3
-5  -3.1    -1.1
-4.8    -5.7    -0.1
-7.7    -4.4    -3.7
3.4 1.8 15.5
14.2    3.5 7.2
-10.2   5.4 -8.6

预期结果:

newdata             
I   II  III IV  Output
-2.5    1.3 -1.7    -8.9    -5
1.3 -1.7    -8.9    -5  -4.8
-1.7    -8.9    -5  -4.8    -7.7
-8.9    -5  -4.8    -7.7    3.4
-5  -4.8    -7.7    3.4 14.2
-4.8    -7.7    3.4 14.2    -10.2
-7.7    3.4 14.2    -10.2   -4.8
3.4 14.2    -10.2   -4.8    0.6
14.2    -10.2   -4.8    0.6 -6.4
-10.2   -4.8    0.6 -6.4    9.7
-4.8    0.6 -6.4    9.7 -3.1
0.6 -6.4    9.7 -3.1    -5.7
-6.4    9.7 -3.1    -5.7    -4.4
9.7 -3.1    -5.7    -4.4    1.8
-3.1    -5.7    -4.4    1.8 3.5
-5.7    -4.4    1.8 3.5 5.4
-4.4    1.8 3.5 5.4 -1.4
1.8 3.5 5.4 -1.4    3.1
3.5 5.4 -1.4    3.1 -1.7
5.4 -1.4    3.1 -1.7    -5.3
-1.4    3.1 -1.7    -5.3    -1.1
3.1 -1.7    -5.3    -1.1    -0.1
-1.7    -5.3    -1.1    -0.1    -3.7
-5.3    -1.1    -0.1    -3.7    15.5
-1.1    -0.1    -3.7    15.5    7.2
-0.1    -3.7    15.5    7.2 -8.6

我尝试使用 mutate 和 for 循环,但我无法获得所需的结果

R 数据帧 突变

评论

0赞 Mark 11/19/2023
嗨,欢迎。您可能需要解释计算的工作原理,以及所有列的含义
0赞 cidc12 11/21/2023
谢谢,马克,回答我的问题。这正是我想要做的。所需结果中指示的列名是我为新列选择的随机名称。输入是位移值

答:

0赞 Mark 11/19/2023 #1

步骤:

  1. 将数据帧转换为向量。
  2. 选择我们希望结果矩阵的大小(在本例中为 5)。
  3. 使用 : 从第一个索引到第 -th 个索引,从向量中获取下一个值。vapply()size minus 1size
  4. 转置矩阵,因为当我们想要一个长矩阵时,会给我们一个宽矩阵。vapply()
v <- unlist(df)
size <- 5
vapply(seq_along(v)[1:(length(v)- size + 1)], \(x) vals[x:(x + size - 1)], numeric(size)) |> t()

输出:

      disp11 disp12 disp13 disp14 disp15
 [1,]   -2.5    1.3   -1.7   -8.9   -5.0
 [2,]    1.3   -1.7   -8.9   -5.0   -4.8
 [3,]   -1.7   -8.9   -5.0   -4.8   -7.7
 [4,]   -8.9   -5.0   -4.8   -7.7    3.4
 [5,]   -5.0   -4.8   -7.7    3.4   14.2
 [6,]   -4.8   -7.7    3.4   14.2  -10.2
 [7,]   -7.7    3.4   14.2  -10.2   -4.8
 [8,]    3.4   14.2  -10.2   -4.8    0.6
 [9,]   14.2  -10.2   -4.8    0.6   -6.4
[10,]  -10.2   -4.8    0.6   -6.4    9.7
[11,]   -4.8    0.6   -6.4    9.7   -3.1
[12,]    0.6   -6.4    9.7   -3.1   -5.7
[13,]   -6.4    9.7   -3.1   -5.7   -4.4
[14,]    9.7   -3.1   -5.7   -4.4    1.8
[15,]   -3.1   -5.7   -4.4    1.8    3.5
[16,]   -5.7   -4.4    1.8    3.5    5.4
[17,]   -4.4    1.8    3.5    5.4   -1.4
[18,]    1.8    3.5    5.4   -1.4    3.1
[19,]    3.5    5.4   -1.4    3.1   -1.7
[20,]    5.4   -1.4    3.1   -1.7   -5.3
[21,]   -1.4    3.1   -1.7   -5.3   -1.1
[22,]    3.1   -1.7   -5.3   -1.1   -0.1
[23,]   -1.7   -5.3   -1.1   -0.1   -3.7
[24,]   -5.3   -1.1   -0.1   -3.7   15.5
[25,]   -1.1   -0.1   -3.7   15.5    7.2
[26,]   -0.1   -3.7   15.5    7.2   -8.6

数据:

df <- read.table(text = "
disp1   disp2   disp3
-2.5    -4.8    -1.4
1.3 0.6 3.1
-1.7    -6.4    -1.7
-8.9    9.7 -5.3
-5  -3.1    -1.1
-4.8    -5.7    -0.1
-7.7    -4.4    -3.7
3.4 1.8 15.5
14.2    3.5 7.2
-10.2   5.4 -8.6", h = T)