R:分别将函数应用于两个变量的每个元素

时间:2016-02-12 00:20:31

标签: r apply mapply multiple-arguments

我有一个带有两个变量x和y的函数:

error: couldn't read version from server: Get https://107.178.212.121/api: dial tcp 107.178.212.121:443: i/o timeout

该功能本身可以正常工作:

error: couldn't read version from server: Get https://107.178.212.121/api: dial tcp 107.178.212.121:443: i/o timeout

但是当我尝试使用带有两个x和y向量的应用函数时,我没有得到正确的56 * 121数组

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

我将非常感谢您的帮助以及有关最快解决方案的建议(例如,data.table或dplyr解决方案比应用更快)。

3 个答案:

答案 0 :(得分:6)

如果你想使用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()更快

答案 1 :(得分:0)

正如您所描述的那样,使用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)

答案 2 :(得分:0)

嗯,你正在使用不同长度的矢量,但如果我理解正确,这可能会有所帮助。我刚用变量i

制作了一个dumby函数
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)))