【问题标题】:How to use apply() with my function如何在我的函数中使用 apply()
【发布时间】:2018-03-17 23:21:00
【问题描述】:
bmi<-function(x,y){
(x)/((y/100)^2)
}

bmi(70,177) 可以工作

但是使用 apply() 不起作用

apply(Student,1:2,bmi(Student$weight,Student$height))

match.fun(FUN) 中的错误: 'bmi(Student$weight, Student$height)' 不是函数、字符或符号

【问题讨论】:

  • 你的函数已经被向量化了,所以你不需要apply,只需要bmi(Student$weight,Student$height)
  • 补充@docendodiscimus 刚才所说的内容。 Student$bmi &lt;- bmi(Student$weight, Student$height) 如果你想要一个带有 bmi 的列。
  • apply(Student, 1, function(x) bmi(x["weight"], x["height"])),但不推荐。

标签: r function apply


【解决方案1】:

目标是什么有点不清楚。如果只是为了得到答案,那么 cmets 会回答它。另一方面,如果目标是了解您做错了什么,请继续阅读。我想说从左到右的第一个错误是传递整个数据帧。我只会通过“身高”和“体重”栏。

下一个错误,同样从左到右,是使用1:2 作为apply 的第二个参数。您显然想“按行”执行此操作,这意味着您应该只使用1,即数据框的第一个维度。

第三个错误是使用函数调用而不是函数名。当 R 函数(在本例中为 apply)需要函数名或匿名函数时,括号中的函数不起作用,如 cmets 所示。

第四个错误是未将值分配给数据框中的列。因此,这可能会通过apply 方法成功地制作所需的额外列。但是,正如 cmets 中所述,这不是最有效的方法。:

Student$bmi_val <- apply(Student[ ,c("weight", "height")], bmi)
 # didn't want my column name to be the same as the function name

apply 函数实际上是为处理矩阵和数组而设计的,因此在很多情况下它不适合与数据帧一起使用。在这种情况下,bmi 函数的所有参数都是数字,并且您可以控制第一个参数中的参数顺序以匹配 x 和 y 位置,这可以说是一种可接受的策略,但不是大多数 R-ish 方法。在使用日期或因子变量时,您绝对应该避免使用apply

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-26
    相关资源
    最近更新 更多