Оставить один для нескольких аргументов с mapply ()? - PullRequest
0 голосов
/ 22 февраля 2019

Имея один вектор A = c(1,2,3,4,5), я могу написать

 sapply(A, function(a) mean(A[-a]))

для вычисления пяти средних: среднее значение A без первого элемента, среднее значение A без второго элемента и т. Д.

Я хотел бы выполнять операции типа "оставь-один-один" с двумя или более векторами одновременно.Например, с B <- c(6,7,8,9,10) я подумал, что мог бы набрать

myFunc <- function(a, b){return( c(mean(A[-a]), mean(B[-b])) )}
mapply(myFunc, A, B)

, но это вычисляет только однозначное значение A:

     [,1] [,2] [,3] [,4] [,5]
[1,]  3.5 3.25    3 2.75  2.5
[2,]  8.0 8.00    8 8.00  8.0

и выводит строку8.0s для B. Что я делаю не так?

Ответы [ 3 ]

0 голосов
/ 22 февраля 2019

Вы можете использовать:

mapply(function(k) c(mean(A[-k]), mean(B[-k])), 1:length(A))
0 голосов
/ 22 февраля 2019

Во-первых, вместо вычисления вектора элементов при вычислении среднего значения вы можете векторизовать свой код: (sum(x) - x) / (length(x) - 1).Кроме того, поскольку у вас есть «два или более вектора», лучше хранить их в списке.Затем вы можете зациклить векторы с помощью lapply.

lapply возвращает список.Однако, если векторы имеют разную длину, вам нужно использовать SIMPLIFY = FALSE в mapply для возврата списка в любом случае.

l <- list(A, B)
f <- function(x) (sum(x) - x) / (length(x) - 1)
lapply(l, f)
# [[1]]
# [1] 3.50 3.25 3.00 2.75 2.50
#
# [[2]]
# [1] 8.50 8.25 8.00 7.75 7.50
0 голосов
/ 22 февраля 2019

В первом векторе «A» значения совпадают с последовательностью.Таким образом, когда мы индексируем это значение и удаляем, оно удаляет соответствующее значение.Во втором векторе 'B' это не тот случай, т.е. B[-6] или B[-7] по-прежнему дает весь вектор.Вместо этого выполните цикл по последовательности

mapply(myFunc, seq_along(A), seq_along(B))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...