2017-10-06 38 views
1
bmi<-function(x,y){ 
(x)/((y/100)^2) 
} 

BMI(70177),它可以工作如何使用應用()與我的功能

但適用()但這並沒有工作

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

錯誤match.fun(FUN ): 'BMI(學生$權重,學生$高度)' 不是一個函數,字符或符號

enter image description here

+7

你的函數已經被矢量化了,所以你不需要'apply',只需'bmi(Student $ weight,Student $ height)' –

+0

添加到剛剛說的@docendodiscimus中。 '學生$ bmi < - bmi(學生$體重,學生$身高)'如果你想要一個有bmi的專欄。 – Tsingis

+0

'apply(Student,1,function(x)bmi(x [「weight」],x [「height」]))',但不推薦。 – kitman0804

回答

0

這有點不清楚目標是什麼。如果只是爲了得到答案,那麼評論就會回答。另一方面,如果目標是理解你做錯了什麼,然後繼續閱讀。我會說從左到右的第一個錯誤是傳遞整個數據幀。我只會通過'身高'和'體重'的列。

下一個錯誤,再次從左到右,使用1:2作爲apply的第二個參數。你顯然希望這樣做「按行」,這意味着你應該只使用1,即數據框的第一維。

而第三個錯誤是使用函數調用而不是函數名稱。帶有括號參數的函數在R函數(在此例中爲apply)期望函數名稱或匿名函數時不起作用,如註釋中所示。

第四個錯誤是未將值分配給數據框中的列。所以這可能會成功地通過apply方法制作所需的額外列。但是,正如評論指出,這是不是最有效的方法:

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

apply功能實際上設計了矩陣和數組的工作,因此對於很多用途與dataframes使用時,它是不適合。在這種情況下,bmi函數的所有參數都是數值型的,並且您可以控制第一個參數中的參數順序以匹配x和y位置,這可以說是一種可接受的策略,但不是大多數R-ish方法。在處理日期或因子變量時,您應該避免使用apply