Функция apply () для столбцов матрицы и элементов числового вектора, соответственно, по порядку - PullRequest
0 голосов
/ 04 мая 2018

У меня есть функция f(list,t), где первый аргумент - list, а второй t - число. Я хочу применить f к столбцам матрицы M и элементам вектора T соответственно. Следовательно, если столбцы M (M_1, M_2, ..., M_k) и T = (t_1, t_2, ..., t_k), я хочу получить следующее:

f (M_1, t_1), f (M_2, t_2), ..., f (M_k, t_k).

Есть ли эффективный способ сделать это без использования цикла for?

Например, если

f <- function(list,x) {x %in% list}
M <- matrix(1:12,4,3)
T <- c(1,2,10)

Я ожидаю получить

TRUE FALSE TRUE

Следующая строка применяет f к каждому столбцу M и каждому элементу T

apply(M,2,f,T)

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

Ответы [ 3 ]

0 голосов
/ 04 мая 2018

Вы также можете использовать sapply, используя количество столбцов в матрице. Позже мы используем any для возврата значения True (если оно есть) из каждого столбца

Tr <- c(1,2,10)
sapply(seq(ncol(M)), function(x) any(f(M[,x], Tr)))

[1]  TRUE FALSE  TRUE
0 голосов
/ 04 мая 2018
mapply(f,as.data.frame(M),T)

as.data.frame необходимо для преобразования M в список столбцов матрицы, а mapply применяет f к полученному списку и вектору T попарно.

0 голосов
/ 04 мая 2018

Преобразуйте вашу матрицу во фрейм данных, а затем используйте функцию map2 из пакета purrr:

library(tidyr)
df <- as.data.frame(M)
unlist(map2(df, t, f))

Также ужасно называть переменную T (или F), поскольку это может вызвать массу проблем с логическими терминами.

...