векторный расчет произведения определенных столбцов - PullRequest
0 голосов
/ 14 декабря 2018

У меня есть матрица с двумя типами имен столбцов: те, которые заканчиваются на "min", и те, которые заканчиваются на "max".например, первая строка и первые 6 столбцов этой матрицы могут быть:

M = matrix(c(0.2, 0.3, 0.5, 0.9, 0.7, 0.6), nrow = 1, ncol = 6)
colnames(M) = c("a_min", "b_min", "c_min", "a_max", "b_max", "c_max")

Я хотел бы, чтобы для каждой строки M вычислилось произведение разности между a_max и a_min, b_max и b_min и т. Д. Для всех пар столбцов.

В приведенном выше примере конечный продукт:

(0.9-0.2)*(0.7-0.3)*(0.6-0.5) = 0.028.

Как я могу это сделатьвекторно для общих 2N столбцов и P строк?

Ответы [ 2 ]

0 голосов
/ 14 декабря 2018

Чтобы вычислить max - min разницу, просто вычтите матрицы, например,

D <- M[, grep('_max', colnames(M))] - M[, grep('_min', colnames(M))]

(вы должны убедиться, что столбцы упорядочены правильно, или будут вычислены неправильные различия).

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

matrixStats::rowProds(D)
0 голосов
/ 14 декабря 2018

Вот идея через базу R,

Reduce(`*`, lapply(split.default(M, sub('_.*', '', colnames(M))), diff))
#[1] 0.028

Если у вас несколько строк, то есть M <- rbind(M, M)

Reduce(`*`, lapply(split.default(as.data.frame(M), sub('_.*', '', colnames(M))), 
                                                             function(i) abs(i[1] - i[2])))
#  a_min
#1 0.028
#2 0.028
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...