代码之家  ›  专栏  ›  技术社区  ›  Helen

带多个参数的映射,其中一个参数为常量(数据)

  •  0
  • Helen  · 技术社区  · 6 年前

    在我构造的函数上使用mapply很困难,因为我在一个更大的环境中编程,例如,如果我编写的函数中有一个参数是 数据 .

    fun_test <- function(data,col,val1,val2){return(data[col][1,] * val1-val2)}
    

    数据 col列 例如可以是常量,但我想根据 价值1 val2号

    > mapply(FUN=fun_test,mtcars,"cyl",mtcars$cyl,mtcars$cyl*2)
    Error in data[col][1, ] : incorrect number of dimensions
    

    我在试着理解mapply是如何工作的;我肯定不能通过mtcars,而“cyl”是一个向量,可以吗?

    :我有一个数据可能会变化的环境,例如,有时我使用mtcars,有时它是另一个数据集。所以我无法将数据硬编码到函数中

    编辑2 1) 我有一些数据集, 2) 我有不同的Excel文件读到R中, 3) 我做了一个查找函数,从R中的这些Excel文件中提取信息, 4) 对于一个或两个变量(来自数据集),当我进入我创建的查找函数并提取信息时。

    0 回复  |  直到 6 年前
        1
  •  2
  •   LyzandeR    6 年前

    mapply 是多维的 lapply . 这意味着,它不只是迭代一个对象(即data.frame的列或向量的元素),而是同时迭代多个对象。唯一的条件是这些对象的长度必须相同,即data.frame的列和向量的长度。因此,不能传递常量(除非传递一个具有相同常量的向量以匹配长度,但为什么要这样做)。

    mapply(sum, 1:10, 11:20)
    

    所以,在你的例子中,把常数直接传递到函数中:

    fun_test <- function(val1, val2){return(mtcars['cyl'] * val1 - val2)}
    
    mapply(FUN=fun_test, mtcars$cyl, mtcars$cyl*2)
    

    更新:

    我想你需要包括 mapply公司 在你的职责范围内。这样你可以添加任何你喜欢的参数(常量和变量)。看起来是这样的:

    myfunc <- function(data, col, val1, val2) {
    
      fun_test <- function(val1, val2) {
        data[col] * val1 - val2 
      }
    
      mapply(FUN=fun_test, val1, val2)
    
    }
    
    myfunc(mtcars, 'cyl', mtcars$cyl, mtcars$cyl*2)
    
        2
  •  1
  •   Ronak Shah    6 年前

    mapply

    fun_test <- function(data,col,val1,val2){return(data[1, col] * val1-val2)}
    
    mapply(FUN=fun_test, list(mtcars),"cyl",mtcars$cyl,mtcars$cyl*2)
    #[1] 24 24 16 24 32 24 32 16 16 24 24 ......
    

    所以第一个值 24 在输出中可以通过

    mtcars[1, "cyl"] * mtcars$cyl[1] - mtcars$cyl[1]*2
    #[1] 24
    

    我知道这是一个例子,实际的实现是不同的,但是您可以通过直接执行

    mtcars[1, "cyl"] * mtcars$cyl - mtcars$cyl*2
    

    browser() 在函数中

    fun_test <- function(data,col,val1,val2){
       browser()
       return(data[1, col] * val1-val2)
    }
    

    现在,调用函数并检查函数中的参数

    mapply(FUN=fun_test, mtcars,"cyl",mtcars$cyl,mtcars$cyl*2)
    Browse[1]> data
    # [1] 21.0 21.0 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 17.8 16.4 17.3 15.2 
    #     10.4 10.4 14.7 32.4 30.4 33.9 21.5 15.5 15.2 13.3 19.2 27.3 26.0 30.4 
    #     15.8 19.7 15.0 21.4
    

    mtcars 那就是 mpg (检查 mtcars$mpg

    它是一个数值向量,现在您试图将 英里/加仑 它的列和索引1会给您同样的错误

    mtcars$mpg["cyl"][1, ]
    

    现在在第二种情况下,当我们将数据帧作为列表传递时,检查 data

     mapply(FUN=fun_test, list(mtcars),"cyl",mtcars$cyl,mtcars$cyl*2)
    
    Browse[1]> data
    #                     mpg cyl  disp  hp drat    wt  qsec vs am gear carb
    #Mazda RX4           21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4
    #Mazda RX4 Wag       21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4
    #Datsun 710          22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1
    #Hornet 4 Drive      21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1
    #Hornet Sportabout   18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2
    #Valiant             18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1
    #....
    

    >data[1, "cyl"]
    #[1] 6
    

    PS-我不知道上下文 为什么?