【问题标题】:Specify arguments when applying function with sapply使用 sapply 应用函数时指定参数
【发布时间】:2020-09-04 17:43:02
【问题描述】:

我创建了以下函数来查找与目标相关的列。为此,该函数应用于 diamonds 数据集(此处分配给 dt)。

select_variables_gen <- function(variable, target = dt$price, threshold = 0.9){
  if(all(class(variable) %in% c("numeric","integer"))){
    corr <-  abs(cor(variable, target));
    if(corr > threshold){
      return(T);
    }else{F}
  }else{F}
};

现在我想应用函数,但不知道如何指定函数的参数。这是我尝试过的

alt_selected_gen <- names(dt)[sapply(dt, 
select_variables(variable = dt, target = dt$carat, threshold = 0.1))]

alt_selected_gen;

返回一个错误,指出第二个和第三个参数未使用。如何使用该函数(使用 sapply 或任何其他方式)来指定参数?

我想要的输出是相关性高于阈值的列的列名。所以在上面的代码中使用默认值就是;

[1] "carat" "price"

【问题讨论】:

    标签: r function sapply


    【解决方案1】:

    你将你的函数传递给sapply。您试图传递的是对您的函数的 调用

    当您在数据框上使用sapply 时,这些列将作为第一个参数逐个发送到您的函数。如果您想将更多命名参数传递给您的函数,您只需将它们作为参数直接添加到函数本身之后的sapply。这是因为 sapply 的形式参数中的点运算符 (...) 有效,它将任何额外的参数传递给对函数的调用。

    因此应该是

    names(dt)[sapply(dt, select_variables_gen, target = dt$carat, threshold = 0.1)]
    #> [1] "carat" "table" "price" "x"     "y"     "z"  
    

    另请注意,在您的示例中,该函数称为 select_variables_gen,而不是 select_variables

    【讨论】:

    • 正确。原因是 apply FUNfunctions 只接受他们循环通过的一个参数。附加参数不能直接传递,而是在FUN 参数之后作为... 传递。使用?sapply 查找。
    • 感谢解释,不胜感激
    猜你喜欢
    • 2015-07-14
    • 2018-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多