R: применить функцию к каждому элементу двух переменных соответственно

У меня есть функция с двумя переменными x и y:

fun1 <- function(x,y) {
  z <- x+y
  return(z)
}

Функция отлично работает сама по себе:

fun1(15,20)

Но когда я пытаюсь использовать его с двумя векторами для x и y с функцией применения, я не получаю правильный массив 56 * 121.

Lx  <- c(1:56)
Ly <- c(1:121)

mapply(fun1, Lx, Ly)

Буду признателен за вашу помощь, а также за совет по самому быстрому решению (например, решение data.table или dplyr быстрее, чем применить).


person adam.888    schedule 12.02.2016    source источник
comment
думаю, что вы хотите outer : outer(Lx, Ly, fun1) или этого q/a   -  person rawr    schedule 12.02.2016


Ответы (3)


Если вы хотите использовать mapply(), вы должны предоставить ему n списков аргументов одинакового размера, которые будут переданы функции n на n, как в:

mapply(fun1,c(1,2,3), c(4, 5, 6))
[1] 5 7 9

или один аргумент может быть скаляром, например:

mapply(fun1,c(1,2,3), 4)
[1] 5 6 7

Поскольку вы пытаетесь использовать все комбинации Lx и Ly, вы можете повторить один список, а затем другой, например:

sapply(Lx, function(x) mapply(fun1,x,Ly))

or

sapply(Ly, function(y) mapply(fun1,Lx,y))

который дает тот же результат, что и предложение rawr

outer(Lx, Ly, fun1)

где outer() намного быстрее

person HubertL    schedule 12.02.2016

Использование dplyr для этой проблемы, как вы ее описали, странно. Кажется, вы хотите работать с векторами, а не с data.frames, а функции dplyr ожидают data.frames и возвращают data.frames, т. е. его входы и выходы являются идемпотентными. Для работы с векторами следует использовать outer. Но dplyr можно втиснуть в эту задачу...

# define variables
Lx  <- c(1:56)
Ly <- c(1:121)
dx <- as.data.frame(Lx)
dy <- as.data.frame(Ly)

require(dplyr)
require(magrittr)  # for the %<>% operator

# the dplyr solution
(dx %<>% mutate(dummy_col = 1)) %>% 
     full_join(
         (dy %<>% mutate(dummy_col = 1)), by='dummy_col') %>% 
     select(-dummy_col) %>% 
     transmute(result = Lx + Ly)
person Curt F.    schedule 16.02.2016

Ну, вы используете векторы разной длины, но, возможно, это поможет, если я правильно понимаю. Я только что сделал тупую функцию с переменной i

fun1 <- function(x,y) {
  z <- x+y
  return(z)
}


fun1(15,20)


Lx  <- c(1:56)
Ly <- c(1:121)


fun1I <- function(x,y,i)
{


  fun1(x[i],y[i])


}


fun1IR <- function(x,y)
{


  function(i)fun1I(x=x,y=y,i=i) #return dumby function

}



testfun <- fun1IR(Lx,Ly) # creates function with data Lx and Ly in variable i

mapply(testfun, 1:min(length(Lx),length(Ly)))
person Stephen Ippolito    schedule 11.06.2016