R: Как я могу получить доходность по строкам в матрице? - PullRequest
0 голосов
/ 05 августа 2020

Сначала я создаю матрицу 5x4 со случайными числами от 1 до 10:

A <- matrix(sample(1:10, 20, TRUE), 5, 4)
> A
     [,1] [,2] [,3] [,4]
[1,]    1    5    6    6
[2,]    5    9    9    4
[3,]   10    6    1    8
[4,]    4    4   10    2
[5,]   10    9    7    5

На следующем шаге я хотел бы получить результаты по строкам (для строки 1: (5-1) / 1, (6-5) / 5, (6-6) / 6 и то же самое для остальных строк). Таким образом, окончательная матрица должна быть матрицей 5x3.

Ответы [ 2 ]

1 голос
/ 05 августа 2020

Вы можете использовать функцию Base R diff(), примененную к вашей транспонированной матрице:

Код:

# Data
set.seed(1)

A <- matrix(sample(1:10, 20, TRUE), 5, 4)

#     [,1] [,2] [,3] [,4]
#[1,]    9    7    5    9
#[2,]    4    2   10    5
#[3,]    7    3    6    5
#[4,]    1    1   10    9
#[5,]    2    5    7    9

# transpose so we get per row and not column returns 

t(diff(t(A))) / A[, -ncol(A)]

           [,1]       [,2]       [,3]
[1,] -0.2222222 -0.2857143  0.8000000
[2,] -0.5000000  4.0000000 -0.5000000
[3,] -0.5714286  1.0000000 -0.1666667
[4,]  0.0000000  9.0000000 -0.1000000
[5,]  1.5000000  0.4000000  0.2857143

0 голосов
/ 05 августа 2020
A <- matrix(sample(1:10, 20, TRUE), 5, 4)

fn.Calc <- function(a,b){(a-b)/a}
B <- matrix(NA, nrow(A), ncol(A)-1)
for (ir in 1:nrow(B)){
    for (ic in 1:ncol(B)){
        B[ir, ic] <- fn.Calc(A[ir, ic+1], A[ir, ic])
    }    
}

небольшое примечание: при работе со случайными функциями приветствуется предоставление начального числа;)

Итак, что у нас здесь: fn.Calc - это просто расчет, который вы пытаетесь выполнить, я выделил это в функции, чтобы при необходимости было легче изменить

, тогда создается новая матрица B, имеющая на 1 столбец меньше, чем A, но те же строки

, наконец, мы собираемся l oop каждый элемент в этой матрице B, мне нравится использовать ir для инкрементных строк и ic для инкрементного столбца и, наконец, внутри l oop (B[ir, ic] <- fn.Calc(A[ir, ic+1], A[ir, ic])), когда происходит magi c там, где фактически значения вычисляются и сохраняются в B

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

...