Перебирать столбцы матрицы в R - PullRequest
4 голосов
/ 20 сентября 2019

У меня есть функция

function (x, y) { ... }

, которая ожидает два вектора x и y и возвращает рассчитанное по ним значение.

Я хочу применить эту функцию попарно квекторы столбцов двух матриц xs и ys.Начиная с R, итерируя по векторам строк матрицы , я обнаружил mapply(), но это, кажется, применяет функцию попарно к каждому элементу матрицы.Вместо этого я хочу применить функцию ко всему столбцу.Как мне это сделать?

Для пояснения вот надуманный пример:

xs <- matrix(c(1, 2, 3, 4, 5, 6), nrow = 3, ncol = 2)
ys <- matrix(c(25, 26, 27, 28, 29, 30), nrow = 3, ncol = 2)
dot <- function(x, y) sum(x*y)

Ответы [ 5 ]

2 голосов
/ 20 сентября 2019

Использование простой for петли

v1 <- numeric(ncol(xs))
for(i in seq_along(v1)) v1[i] <- dot(xs[,i], ys[,i])
v1
#[1] 158 437

Или с векторизацией

colSums(xs * ys)
#[1] 158 437
2 голосов
/ 20 сентября 2019

Вот один из способов:

xs <- matrix(c(1, 2, 3, 4, 5, 6), nrow = 3, ncol = 2)
ys <- matrix(c(25, 26, 27, 28, 29, 30), nrow = 3, ncol = 2)
dot <- function(x, y) {
  sum(x*y)
}

dots <- sapply(1:ncol(xs),function(i) dot(xs[,i],ys[,i])) #dots = c(158, 437)
1 голос
/ 20 сентября 2019

Никто еще не упомянул asplit (добавлено в R 3.6.0) - функция, созданная специально для этого случая.

Пример:

mapply(dot, asplit(xs, 2), asplit(ys, 2))

То же, но с использованием строк:

mapply(dot, asplit(xs, 1), asplit(ys, 1))
1 голос
/ 20 сентября 2019

Вы также можете использовать mapply следующим образом:

mapply(function(i, x = xs, y = ys) dot(x[,i],y[,i]), 1:ncol(xs))

или использовать purrr:

purrr::map_dbl(1:ncol(xs), function(i,x,y) dot(x[,i],y[,i]), x = xs, y = ys)
1 голос
/ 20 сентября 2019

отображение списка ожидаемых данных или фрейма данных для столбца:

mapply(dot,as.data.frame(xs),as.data.frame(ys))

 V1  V2 
158 437
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...