2016-12-06 33 views
3

這是一個有點棘手,以顯示我的真實數據的問題,但我希望以下的介紹:dplyr ::發生變異:臨時貴變量輸入到其他幾個操作,橫行

data_frame(a=c(1,2), b=c(3,4)) %>% 
rowwise %>% 
mutate(c = a*b, d = c-1, e=c+2) %>% 
ungroup 

在上面的例子中當然rowwise是不需要的。

現在讓我們假設c的計算既耗時又耗時,c是一個很大的對象而沒有向量化。 所以你不需要執行兩次,並且希望在每一行計算髮生後從內存中清除它。

有沒有一個聰明的方法來做到這一點?也許用purrr::map

+0

有人請糾正我,如果我錯了,但對象沒有矢量化;它是矢量化的操作。在這種情況下,對於矢量'a'和'b',乘法,加法和減法都是矢量化的。因此,對於'c'。如果我說的話完全沒有了,那麼我可能不會理解這個問題。 – Abdou

+0

是的,我的意思是創建c,d,e的計算/操作應該假設不是爲了我的目的而被矢量化的。 –

回答

3

這是使用purrr s invoke_rows的答案。

library(purrr) 

MyDf<-data.frame(a=c(1,2), b=c(3,4)) 
invoke_rows(.d=MyDf, .f=function(a,b){c=a*b 
c(d=c-1, 
e=c+2)}, 
.collate="cols") 

更新

針對@JanStanstrup的評論,如果您有另一列要作爲輸出的一部分,但不會出現在計算中,你可以這樣做:

MyDf<-data.frame(a=c(1,2), b=c(3,4), dummy=c(6,7)) 
invoke_rows(.d=MyDf, .f=function(a,b,...){c=a*b 
c(d=c-1, 
    e=c+2)}, 
.collate="cols") 

這裏,dummy和任何其它列經由...作爲參數傳遞到.f功能,但在這種功能不被使用,所以它們只是一直傳下去。

+0

太棒了!這樣可行。我注意到,如果.d包含未在.f中引用的列,它似乎會出錯。 - >'MyDf <-data.frame(a = c(1,2),b = c(3,4),dummy = c(6,7))' - >'unused argument(dummy = .d [[c(3,i)]])'。任何修補程序?當然,我可以將結果與原始數據框架結合起來,但看起來不夠優雅。 –

+0

我看到你將未使用的列添加到函數中。雖然這可行,但如果你有很多列,可能會有點混亂。如果添加新列,則更難以維護。也許有一種方法可以將所有這些列名輸入到函數中來提取列名稱? –

+0

另外我想你可以只包括一列,這是唯一的,你可以加入你的原始表。 –