如何将数据框拆分为与 R 大小相同的元素,由另一个大小重叠,保留每个元素?

Posted

技术标签:

【中文标题】如何将数据框拆分为与 R 大小相同的元素,由另一个大小重叠,保留每个元素?【英文标题】:How to split a dataframe in elements of the same size with R, overlapped by another size, keeping every element? 【发布时间】:2022-01-11 06:11:17 【问题描述】:

我想应用一种称为 CCF Sliding-Windows 的方法,其中我需要将我的时间序列拆分为 90 天的窗口,重叠 45 天,最后一部分需要在时间的最后一天结束系列(在某种程度上,它可以与上一次拆分重叠超过 45 天)。

举例来说,有一张图片来表示这个方法的应用:

有人知道我如何使用 R 来做到这一点吗?我想创建一个聚合数据帧时间窗口的列表,这样我就可以 purrr::map 来获取互相关。

【问题讨论】:

【参考方案1】:

您可以从zoo 尝试rollapply

library(zoo)

# your data "ts"
# window size 90
# function 'c' gives you the data
# your overlap 45
# partial window at the end either "TRUE" or
#  the minimum window size allowed, e.g. half window size
# align starts with first full window on left side
rollapply( ts, 90, c, by=45, partial=45, align="left" )

# e.g.
rollapply( 1:20, 5, c, by=3, partial=3, align="left" )
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    2    3    4    5
[2,]    4    5    6    7    8
[3,]    7    8    9   10   11
[4,]   10   11   12   13   14
[5,]   13   14   15   16   17
[6,]   16   17   18   19   20

【讨论】:

【参考方案2】:

我将在整数向量上进行演示。为了简洁起见,我将不使用“90”和“45”,而是使用“14”和“7”(任意)。

vec <- 100 + 1:28
winsize <- 14
minsize <- 7

最后一个窗口应该开始于

laststart <- length(vec) - winsize + 1
laststart
# [1] 15

从这里,我们可以将其拆分为

starts <- 1 + (seq_len(ceiling(length(vec) / minsize)) - 1) * minsize
starts <- c(starts[starts < laststart], laststart)
Map(function(a, b) vec[a:b], starts, starts - 1 + winsize)
# [[1]]
#  [1] 101 102 103 104 105 106 107 108 109 110 111 112 113 114
# [[2]]
#  [1] 108 109 110 111 112 113 114 115 116 117 118 119 120 121
# [[3]]
#  [1] 115 116 117 118 119 120 121 122 123 124 125 126 127 128

每个都是长度 14,最后一个结束于 vec 的最后一个元素。

如果数据不完全对齐,这仍然有效。

vec <- 100 + 1:40
winsize <- 14
minsize <- ceiling(winsize / 2)
laststart <- length(vec) - winsize + 1
starts <- 1 + (seq_len(ceiling(length(vec) / minsize)) - 1) * minsize
# the last window is at most minsize, we need it to be between minsize and winsize
starts <- c(starts[starts < laststart], laststart)
Map(function(a, b) vec[a:b], starts, starts - 1 + winsize)
# [[1]]
#  [1] 101 102 103 104 105 106 107 108 109 110 111 112 113 114
# [[2]]
#  [1] 108 109 110 111 112 113 114 115 116 117 118 119 120 121
# [[3]]
#  [1] 115 116 117 118 119 120 121 122 123 124 125 126 127 128
# [[4]]
#  [1] 122 123 124 125 126 127 128 129 130 131 132 133 134 135
# [[5]]
#  [1] 127 128 129 130 131 132 133 134 135 136 137 138 139 140

【讨论】:

以上是关于如何将数据框拆分为与 R 大小相同的元素,由另一个大小重叠,保留每个元素?的主要内容,如果未能解决你的问题,请参考以下文章

将 DataFrame 转换为 RDD 并将 RDD 动态拆分为与 DataFrame 相同数量的 Columns

如何将 UITableViewWrapper 的大小调整为与 UITableView 相同的大小?

如何将元素定义为与随机访问迭代器指向的元素相同的类型?

R:如何将数据框拆分为训练集、验证集和测试集?

按列值将数据框拆分为两个[重复]

假设某个元素与 R 中的 CSV 文件的文件名相同,则将数据框中的某个元素相乘