2016-08-14 117 views
2

我需要找到一組持續時間的最大公約數(gcd):durR - 最大公約數dplyr例程

我的數據是這樣的

  actrec dur 
1 c Personal Care 120 
2  c Free Time 10 
3  c Free Time 70 
4  c Free Time 40 
5   b Unpaid 10 
6  c Free Time 20 
7 c Personal Care 30 
8  c Free Time 40 
9  c Free Time 40 
10  c Free Time 10 

我使用的功能schoolmathgcd。 我正在循環訪問我的數據並將值存儲在向量v中。 最後,我使用vmin來查找我的數據的gcd。

library(schoolmath) 

l = length(dt$dur) 
v = array(0, l) 

for(i in 2:l){ 
    v[i] = gcd(dt$dur[i], dt$dur[i-1]) 
} 

minV = min(v[-1]) 
minV 

其中給出10

但是,我很難將此例程翻譯爲dplyr

我想到了類似(lag for循環)。

dt %>% mutate(gcd(dur, lag(dur, 0))) 

但它不工作。我不確定如何插入min

任何線索?

+0

看起來'gcd'沒有矢量化。也許'dt%>%mutate(dur1 = lag(dur,default = dur [1]))%>%rowwise()%>%mutate(new1 = gcd(dur,dur1))' – akrun

+1

這裏是矢量化版本的gcd這可能是有用的http://stackoverflow.com/a/21504113/3001626 –

+0

感謝有趣 – giacomo

回答

2

我們可以用rowwise採取的「杜爾,提取‘名new1’,並獲得lag後申請各行上gcd功能min

dt %>% 
    mutate(dur1 = lag(dur, default = dur[1])) %>% 
    rowwise() %>% 
    mutate(new1 = gcd(dur, dur1)) %>% 
    .$new1 %>% 
    tail(.,-1) %>% 
    min 
#[1] 10 

或者我們創造一個Vectorize d功能的「gcd上述」和應用上的「杜爾」列

gcdV <- Vectorize(function(x,y) gcd(x, y)) 
dt %>% 
    mutate(new1 = gcdV(dur, lag(dur, default = dur[1]))) 

,並得到min如在T他以上的解決方案

+1

謝謝 - 很好的答案。我很驚訝代碼必須這麼長。 – giacomo

+1

@giacomoV我正在提取'min'作爲一個單一的值。如果你想作爲data.frame,它可能是'dt%>%彙總(Min = min(gcdV(dur,lag(dur,default = dur [1]))[ - 1]))' – akrun

+1

我明白了,謝謝! – giacomo