2013-09-02 5 views
0

저는 비교적 기본적인 질문이 있습니다.행렬의 행에 걸쳐 벡터 반복하기

필자에게는 20 열 50 행의 행렬이 있습니다. 20 개의 숫자로 구성된 벡터가 있습니다.

각 행이 이전 행의 값 (즉, 행 [n] < -row [n-1] * 1.5)을 기반으로하도록 행렬의 각 행에 벡터를 곱하고 싶습니다.

for 루프를 사용한다고 가정합니다.하지만이를 수행하기 위해 올바른 명령을 알아낼 수 없습니다. 지금까지는 "대체 할 항목의 수는 대체 길이의 배수가 아닙니다"라는 경고 메시지를 표시하며 행렬의 첫 번째 열에 대해서만 작업을 수행합니다.

예제 코드 :

trun<-50 
prun<-20 
M<-matrix(0,trun,prun) 
M[1,]<-10 
v<-seq(0.05,1,by=0.05) 
for (t in 2:trun) 
{ 
M[t]<-M[t-1]*v 
} 
+0

오신 것을 환영합니다. 여러분의 벡터'v'는 길이가 20이고 열 벡터의 길이는 50입니다. 그래서 R은 경고를줍니다; 이 경우 R은 재활용됩니다. – Metrics

+1

't' 행을 참조하려면'M [t]'대신'M [t,]'를 사용하십시오. –

답변

0

내가 솔루션의 mtcars 데이터를 사용 : (당신은 당신의 문제에 대한 R for loop를 사용하여 피할 수있다, 나는 그것을 위해 map 아래 사용)

mydata<-mtcars[1:10,1:4] 
    mydata<-as.matrix(mydata) 
> mydata 
        mpg cyl disp hp 
Mazda RX4   21.0 6 160.0 110 
Mazda RX4 Wag  21.0 6 160.0 110 
Datsun 710  22.8 4 108.0 93 
Hornet 4 Drive 21.4 6 258.0 110 
Hornet Sportabout 18.7 8 360.0 175 
Valiant   18.1 6 225.0 105 
Duster 360  14.3 8 360.0 245 
Merc 240D   24.4 4 146.7 62 
Merc 230   22.8 4 140.8 95 
Merc 280   19.2 6 167.6 123 

    myvec<-seq(1,8,1) 
    kk<-ldply(Map(function(x) myout=myvec*mydata[(2:dim(mydata)[1]),x], as.list(colnames(mydata)))) # applying over over all columns. 
library(plyr) 
myout<-t(ldply(kk)) 



         [,1] [,2] [,3] [,4] 
Mazda RX4   21.0 6 160.0 110 
Mazda RX4 Wag  42.0 12 320.0 220 
Datsun 710   68.4 12 324.0 279 
Hornet 4 Drive  85.6 24 1032.0 440 
Hornet Sportabout 93.5 40 1800.0 875 
Valiant   108.6 36 1350.0 630 
Duster 360  100.1 56 2520.0 1715 
Merc 240D   195.2 32 1173.6 496 
Merc 230   22.8 4 140.8 95 
Merc 280   38.4 12 335.2 246 

참고 : vec의 길이가 단지 8이기 때문에 각 열의 처음 8 개 요소 (첫 번째 행 제외) 만 변형됩니다.

0

잘 모르겠지만, 처음에는 for-loop을 사용하고 apply을 사용하여 원하는대로 처리합니다. 두 가지 방법 모두 동일한 대답을 제공합니다.

set.seed(1234) 

nrow <- 5 
ncol <- 7 

M <- matrix(floor(runif(nrow*ncol, 0, 10)), ncol = ncol, byrow=TRUE) 
M <- as.data.frame(M) 
M 
# V1 V2 V3 V4 V5 V6 V7 
# 1 1 6 6 6 8 6 0 
# 2 2 6 5 6 5 2 9 
# 3 2 8 2 2 1 2 3 
# 4 3 1 0 2 8 5 9 
# 5 8 0 4 2 3 5 1 

v <- seq(1, 5, by = (5-1)/(ncol-1)) 
v 
# [1] 1.000000 1.666667 2.333333 3.000000 3.666667 4.333333 5.000000 

for (t in 2:nrow(M)) 
    { 
    M[t,] <- M[t-1,] * v 
    } 
M 

M.bottom <- as.data.frame(t(sapply(seq(2,nrow(M)), function(i) { apply(M[i-1,], 1, function(x) x * v) }))) 

new.M <- rbind(M[1,], M.bottom) 
new.M 

# V1  V2  V3 V4   V5  V6 V7 
# 1 1 6.00000 6.00000 6 8.00000 6.0000 0 
# 2 1 10.00000 14.00000 18 29.33333 26.0000 0 
# 3 1 16.66667 32.66667 54 107.55556 112.6667 0 
# 4 1 27.77778 76.22222 162 394.37037 488.2222 0 
# 5 1 46.29630 177.85185 486 1446.02469 2115.6296 0 
관련 문제