2016-03-15 147 views
1

我有一個數據框。爲了論證的緣故,我們假設它是datasets::women數據框。我想通過對每一行應用一個函數從框架創建一個向量。R:使用函數dplyr :: mutate/dplyr :: transmute作用於整行

看來,通常的方式做到這一點是使用dplyr,並呼籲mutatetransmute,例如:

dplyr::transmute(women, some_index = 2 * height + weight) 

大:工程。 但如果我拉出來的some_index計算到作用於一排功能:

calc_some_index <- function(woman) { 
    2 * woman$height + woman$weight 
} 

有沒有一種方法,我應該叫mutate/transmute,使其調用其輸入的每一行這個功能呢?

當然,我可以看到,我得到正確的結果,如果我叫

dplyr::transmute(women, some_index=calc_some_index(women)) 

,但我相信這僅僅是「欺騙」通過,預先計算的膠層計算向量,對transmute通話。它不起作用,例如,如果我打電話:

dplyr::transmute(head(women, n=10), some_index=calc_some_index(women)) 

回答

2

我覺得你是在發生維度錯誤。

如果我做

library(dplyr) 
transmute(head(women, n=10), 
      some_index=calc_some_index(head(women,10))) 

然後它(在你的代碼中的錯誤有關大小不同的抱怨)

或者,你可以使用管道和它的作品:

head(women, 10) %>% 
    transmute(calc_some_index(.)) 
+0

呀,也許這不是問題的最清晰的例證。我知道我可以在第一個位置(無論是「女性」還是「頭部(女性,n = 10)」)採取任何*,並將其用作第二位職能的參數,但我不會我不想像這樣重複自己,你對管道提出的建議與我想要的接近,並且我知道它是如何工作的(即''.''只代表全部的管道),但可以它會在沒有管道的情況下完成嗎? – Peter

+0

我認爲你使用管道運算符'%>%'和調用'.'變量的函數是最好的解決方案。深入挖掘,我瞭解到'dplyr'提供了通過在自定義環境中使用'eval'來簡化短列的引用(例如'height'而不是'foo $ height')。爲了使它以我想的方式工作,在'eval'中評估的表達式需要直接參考我認爲不可能的封閉環境。 – Peter