2017-01-09 2 views
0

Я хотел бы, чтобы заполнить матрицу, используя информацию из двух других матрицНаполнение матрицы, используя значения из двух других матриц непредсказуемого размера

мне удалось сделать это с помощью данного набора данных, но мне нужно интегрировать этот в более крупном скрипте, и размер двух матриц, которые я использую для заполнения большей матрицы, может различаться каждый раз.

Пример данных:

days = 150 
block <- matrix(c(50,120,150), nrow=3, ncol=1) 

     [,1] 
[1,] 50 
[2,] 120 
[3,] 150 

e1  <- matrix(c(0.1,0.5,0.7), nrow=3, ncol=1) 

     [,1] 
[1,] 0.1 
[2,] 0.5 
[3,] 0.7 

result <- matrix(0, nrow = 150, ncol=1) 

мне нужно создать вектор чисел (взятый из e1), которые повторяются в зависимости от каждого числа в «блоке»

ниже код демонстрирует желаемый результат в этот экземпляр, однако я пытаюсь написать более гибкий скрипт, который может справиться с меньшим или более чем 3-мя блоками.

Я ценю, что, возможно, это намного проще, но моя голова застряла в и я не могу получить из этого!

for (v1 in 1:days){ 
    if(v1 <= block[1,1]){ 
    result[v1,1] <- e1[1,1] 
    } 
    else if (v1 > block[1,1] & v1 <= block[2,1]){ 
    result[v1,1] <- e1[2,1] 
    }  
    else if (v1 > block[2,1] & v1 <= block[3,1]){ 
    result[v1,1] <- e1[3,1] 
    } 
} 

Любая помощь будет очень признательна!

ответ

1

Вы можете получить это, используя хорошую особенность rep:

result <- rep(e1, c(block[1], diff(block))) 
# cast the vector as a column matrix 
result <- matrix(result, length(result)) 

Это работает, потому что rep принимает вектор в его второй аргумент, который говорит ему, сколько раз повторять каждый элемент своего первого аргумента.

Если вы знаете длину загодя, вы можете объединить строки, как

result <- matrix(rep(e1, c(block[1], diff(block))), days) 

, например.

+0

О, Боже мой, я мог плакать. Я потратил часы на это: D СПАСИБО! – SDes

+0

Несомненно. Это может быть чрезвычайно полезной функцией для гибко расширяющихся векторов. – lmo

Смежные вопросы