2017-10-07 8 views
1

私は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 

答えて

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))[] 
+0

これは興味深いようですが、必要な列の数はわかりません。 'embed(x [1]、nrow(x)-5 + 1)[、(n)(x)-5 + 1):1]' –

+0

はい、うまくいくでしょう。答えを更新してkを計算してください。 –

1

私はこれが何をすべき集まる:その後、x <- df[[the_index_you_want]]を行うと開始するvectorではありません

> # 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場合。

関連する問題