2014-06-06 3 views
2

의 1 열을 사용하여 R 행렬의 내가 벡터 있다고 가정 해 봅시다충전 데이터

x <- c(1:30) 

내가하고 싶은 것은 매트릭스를 만들라고 nrow = 30 &을 NcoI = 3 및 사용하여 매트릭스와 끝까지 행 3에서 (1,2,3), 행 4 = (2, 3, 4), 행 5 = (3, 4, 5) 등으로 시작하는 벡터는 행 30에서 (28 , 29, 30).

두 행 1 &이 내가 주위를 둘러 보았다 한

값이없는 있지만, 캔트이 특정 예를 찾을 것으로 보인다.

+3

시도해 보셨습니까? –

+0

아래 일부 답변. 한 번에 모든 작업을 수행 할 수있는 순수한 행렬 구문을 찾고있었습니다. Josilber는 아래의 rbind & cbind를 사용합니다. 마치 내가 똑같은 일을 매우 빠르게 수행 한 매우 공예적인 "매트릭스"진술을 본 것으로 생각했습니다. 그러나 rbind & cbind는 매우 빠르므로이를 시도 할 것입니다. 즉, 좋은 매트릭스 1 라이너를 알고 있다면, 나는 모든 귀입니다. 건배! –

답변

0

또 다른 접근 방식을 :

make_mat <- function(x, nrow, ncol) 
{ 
    seqx <- seq_along(x) 
    do.call(rbind, 
      c(as.list(rep(NA, (ncol - 1))), 
      list(t(mapply(function(i, j) x[i:j], 
       head(seqx, -(ncol - 1)), 
       head(seqx, -(ncol - 1)) + (ncol - 1)))))) 
} 

make_mat(1:5, 5, 3) 
#  [,1] [,2] [,3] 
#[1,] NA NA NA 
#[2,] NA NA NA 
#[3,] 1 2 3 
#[4,] 2 3 4 
#[5,] 3 4 5 
set.seed(101); x = runif(5) 
x 
#[1] 0.37219838 0.04382482 0.70968402 0.65769040 0.24985572 
make_mat(x, 5, 3) 
#   [,1]  [,2]  [,3] 
#[1,]   NA   NA  NA 
#[2,]   NA   NA  NA 
#[3,] 0.37219838 0.04382482 0.7096840 
#[4,] 0.04382482 0.70968402 0.6576904 
#[5,] 0.70968402 0.65769040 0.2498557 
+1

나도 좋아. 속도를 찾고 있으므로 이것을 rbind/cbind와 비교해 보겠습니다. 고맙습니다! –

+0

방금 ​​테스트 한 것과 다른 테스트되었습니다. 이것은 가장 빠릅니다. system.time (M1 - : 희미 (M1) [1] 5677 개 61 감사 다시! 좋은 주말 보내세요! –

+0

이것은 순차적 데이터에서 매우 잘 작동합니다. 만약 내가 같은 방식으로 누워 싶었던 일련의 연속적인 데이터가 있다면, 당신은 여기서 어떻게 다르게 할 것인가? 그리고 "동일하다"는 말은 "래그"를 의미하고 매트릭스 행을 가로 질러 시계열 순서대로 정렬됩니다. 타이! –

2
x <- sapply(1:3, function(i) c(rep(NA, 3-i), x, rep(NA, i))) 
x[1,] <- x[2,] <- NA 
x <- x[1:30,] 
2

당신은 rbindcbind 하나 개의 라인에서이 작업을 수행 할 수 있습니다

rbind(NA, NA, cbind(x[1:(length(x)-2)], x[2:(length(x)-1)], x[c(-1, -2)])) 
#  [,1] [,2] [,3] 
# [1,] NA NA NA 
# [2,] NA NA NA 
# [3,] 1 2 3 
# [4,] 2 3 4 
# [5,] 3 4 5 
# [6,] 4 5 6 
# [7,] 5 6 7 
# [8,] 6 7 8 
# [9,] 7 8 9 
# [10,] 8 9 10 
# [11,] 9 10 11 
# [12,] 10 11 12 
# [13,] 11 12 13 
# [14,] 12 13 14 
# [15,] 13 14 15 
# [16,] 14 15 16 
# [17,] 15 16 17 
# [18,] 16 17 18 
# [19,] 17 18 19 
# [20,] 18 19 20 
# [21,] 19 20 21 
# [22,] 20 21 22 
# [23,] 21 22 23 
# [24,] 22 23 24 
# [25,] 23 24 25 
# [26,] 24 25 26 
# [27,] 25 26 27 
# [28,] 26 27 28 
# [29,] 27 28 29 
# [30,] 28 29 30 
0
a <- matrix(NA,nrow=30,ncol=3) 
for(i in 1:ncol(a)) a[3:30,i]<- (1:30)[i:(i+28-1)] 
a 
+0

이것은 내가 시작한 방법이지만 for 루프를 사용하는 것보다 행렬을 채우는 더 효율적인 방법을 원합니다. 하지만 고마워! –

4

을 당신이 작은 알려진 embed 찾고있는 생각 기능 :

rbind(NA,NA, embed(1:30, 3)[,3:1]) 
     [,1] [,2] [,3] 
[1,] NA NA NA 
[2,] NA NA NA 
[3,] 1 2 3 
[4,] 2 3 4 
[5,] 3 4 5 
[6,] 4 5 6 
[7,] 5 6 7 
[8,] 6 7 8 

snipped.... 
[27,] 25 26 27 
[28,] 26 27 28 
[29,] 27 28 29 
[30,] 28 29 30 
+0

alexis_laz가 추가 한 솔루션이 가장 빠르며 내가 원했던대로 정확하게 맞습니다. 그래도 고마워. 나는 새롭고 충분한 S.O를 가지고 있지 않습니다. 아직 투표 할 수 없다. 죄송합니다. –

+0

응? 당신은 "순수 매트릭스 진술"을 원한다고 생각했습니다. –

+0

잘 작동하지만 ncol = 61 인 경우, 한 명령문에서 61 "NA"를 더 쉽게 rbind하지 않으면 61 "NA"를이 실행에 추가해야합니다. 다시 한번 감사드립니다. –