2016-08-14 6 views
2

持続時間の集合の最大公約数(gcd)を見つける必要があります:dur。私は機能schoolmathライブラリのgcdを使用していますR - 最大公約数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 

私のデータは、このように見えます。 データをループして、ベクトルvに値を格納しています。 最後に、minvを使用して、自分のデータのgcdを検索します。 10を与える

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 

しかし、私はこのルーチンをdplyrに翻訳するのに問題があります。

私は(lag for loopのようなものを考えました。

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

しかし、動作しません。そして、私はminをどのように挿入するのか不明です。

ヒント?

+0

'gcd'はベクトル化されていないようです。 – akrun

+1

ここでは、gcdのベクトル化されたバージョンがあります(%d%これは役立つかもしれませんhttp://stackoverflow.com/a/21504113/3001626 –

+0

おかげで面白い – giacomo

答えて

2

我々はNE​​W1 『「DUR、抽出』と取得のlagを取った後、各行にgcd関数を適用するrowwiseを使用することができますmin

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

それともVectorize D機能を作成します「GCD」と「DUR」列

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

に適用され、トンのようにminを取得します彼は解決策の上にいる。

+1

ありがとう - すばらしい答え。私は実際にコードが長くなければならないことに驚いています。 – giacomo

+1

@giacomoV私は単一の値として 'min'を抽出していました。あなたがdata.frameとして望むなら、 'dt%>%summarize(Min = min(gcdV(dur、lag(dur、default = dur [1]))) ') – akrun

+1

私は、ありがとうございました! – giacomo

関連する問題