簡體   English   中英

使用Apply或Vectorize將自定義函數應用於數據框

[英]Using Apply or Vectorize to apply custom function to a dataframe

我試圖應用一個自定義函數,該函數調用該數據框的組件進行計算。 我在下面做了一個瑣碎的例子,因為我的實際問題很難做出可復制的例子。 在下面的示例中,我希望將前兩列加在一起以創建第三列,即它們的總和。 下面是我在網上找到的一個接近我想要的示例:

celebrities=data.frame(name=c("Andrew","matt","Dany","Philip","John","bing","Monica"),
                       age=c(28,23,49,29,38,23,29),
                       income=c(25.2,10.5,11,21.9,44,11.5,45))
f=function(x,output){
  name=x[1]
  income=x[3]
  cat(name,income,"\n")
}
apply(celebrities,1,f)

但是,當我嘗試使用它並應用數學函數時,它不起作用:

  f2=function(x,output){
  age=x[2]
  income=x[3]
  sum(age,income)
}
apply(celebrities,1,f2)

本質上,我需要申請以獲取數據集,使用該行中的值作為函數的輸入遍歷該數據集的每一行,並向該數據集添加第三列以及函數的結果。 請讓我知道如何在需要時澄清這個問題。 我已經提到了以下問題,但它們似乎對我沒有用。

將函數應用於矩陣或數據框的每一行

如何將新值從lapply分配給列表中數據框的新列

在數據框的每一行上調用類似應用的函數,每一行具有多個參數

對於請求的特定任務,可能是

celebrities$newcol <- with(celebrities, age + income)

+函數本質上是矢量化的。 使用applysum是低效的。 通過省略第一列可以大大簡化了apply使用,因為這樣可以避免強制轉換為由第一列引起的字符矩陣。

 celebrities$newcol <- apply(celebrities[-1], function(x) sum(x) )

這樣,您就可以避免將向量強制轉換為“字符”,然后需要將之前的數字列強制轉換回numeric 使用sum內適用不回避的事實,和沒有矢量得到的,但它的效率低下[R編碼的一個例子。

如果“內部”算法可以完全由矢量化函數構造而成,則可以實現自動矢量化:Math和Ops組是通常的組件。 請參閱?Ops 否則,您可能需要使用mapplyVectorize

來自@ r2evans和@ user2738526的提示我已經對您的函數進行了修改。 將數字顯式轉換為數字。 以下代碼段適用於您的情況:

f2=function(x,output){
  age=as.numeric(x[2])
  income=as.numeric(x[3])
  sum(age,income)
}
apply(celebrities,1,f2)

[1] 53.2 33.5 60.0 50.9 82.0 34.5 74.0

試試看:

library(dplyr)
celebrities=data.frame(name=c("Andrew","matt","Dany","Philip","John","bing","Monica"),
                       age=c(28,23,49,29,38,23,29),
                       income=c(25.2,10.5,11,21.9,44,11.5,45)) 

celebrities %>% 
  rowwise %>% 
  mutate(age_plus_income = sum(age, income))

(很明顯,對於兩列的求和,最好使用mutate(celebrities, age_plus_income = age + income) ,但我認為您的實際示例使用的是更復雜的函數。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM