我有一个data.frame
,我想将其拆分为cbind
的连续子集。例如,使用以下data.frame
,我想要5个数据点的所有序列。最终结果将是3列(见下文)。
x <- data.frame(c(1,7,2,5,3,6,4))
以下是我将如何使用循环,但我想要一些矢量化。
res <- NULL
for (i in 1:3){
res_temp <- x[i:(i+4),]
res <- cbind(res,res_temp)
}
res
res_temp res_temp res_temp
[1,] 1 7 2
[2,] 7 2 5
[3,] 2 5 3
[4,] 5 3 6
[5,] 3 6 4
答案 0 :(得分:1)
以下是一些解决方案。它们都在第一行使用k
的值:
k <- nrow(x) - 5 + 1
# 1 - embed
embed(x[[1]], k)[, k:1]
# 2 - sapply
t(sapply(seq_len(nrow(x) - k + 1), function(i) x[i + 1:k-1, 1]))
# 3 - rollapplyr
library(zoo)
rollapplyr(x[[1]], k, c)
# 4 - lag.zoo
library(zoo)
na.omit(lag(zoo(x[[1]]), 1:k-1))[]
答案 1 :(得分:1)
我认为应该这样做:
> # input
> length_n <- 5
> x <- c(1,7,2,5,3,6,4)
>
> # make table
> length_x <- length(x)
> n_new_cols <- length_x - length_n + 1
> final_n_elemnts <- n_new_cols * length_n
>
> idx <- 0:(final_n_elemnts - 1)
> idx <- (idx %/% length_n) + (idx %% length_n) + 1
> out <- matrix(x[idx], ncol = n_new_cols)
> out
[,1] [,2] [,3]
[1,] 1 7 2
[2,] 7 2 5
[3,] 2 5 3
[4,] 5 3 6
[5,] 3 6 4
如果x
不是vector
,请执行x <- df[[the_index_you_want]]
。