【问题标题】:R: apply a function to every element of two variables respectivelyR:分别对两个变量的每个元素应用一个函数
【发布时间】:2016-05-23 00:21:48
【问题描述】:

我有一个带有两个变量 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 解决方案比应用更快)。

【问题讨论】:

  • 认为你想要 outer : outer(Lx, Ly, fun1)this q/a

标签: r apply mapply multiple-arguments


【解决方案1】:

如果您想使用mapply(),您必须为其提供 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() 更快

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-03-22
        • 1970-01-01
        相关资源
        最近更新 更多