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 解决方案比应用更快)。

如果你想

使用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

由于您尝试使用 LxLy 的所有组合,因此您可以迭代一个列表,然后迭代另一个列表,例如:

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

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

这产生了与 Rawr 在上面评论中的命题相同的结果

outer(Lx, Ly, fun1)

outer()更快的地方

正如您所描述的,使用dplyr来解决这个问题很奇怪。 您似乎想要使用向量,而不是 data.frames,并且dplyr函数期望 data.frame 输入并返回 data.frame 输出,即它的输入和输出是幂等的。 要使用向量,应使用 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)

好吧,您使用的是不同长度的向量,但如果我理解正确,这可能会有所帮助。我刚刚用变量 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)))

相关内容

  • 没有找到相关文章

最新更新