R - 最常见的除数dplyr例程

时间:2016-08-14 14:05:55

标签: r dplyr

我需要找到一组持续时间的最大公约数(gcd):dur

我的数据看起来像这样

            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 

我正在使用gcd库的函数schoolmath。 我循环遍历我的数据并将值存储在向量v中。 最后,我使用min的{​​{1}}来查找数据的gcd。

v

给出了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 for循环)。

lag

但它不起作用。我不确定如何插入dt %>% mutate(gcd(dur, lag(dur, 0)))

有任何线索吗?

1 个答案:

答案 0 :(得分:2)

我们可以使用rowwise在获取'{1}}'dur之后在每一行应用gcd函数,提取'new1'并获取lag

min

或者我们创建'{gcd'的dt %>% mutate(dur1 = lag(dur, default = dur[1])) %>% rowwise() %>% mutate(new1 = gcd(dur, dur1)) %>% .$new1 %>% tail(.,-1) %>% min #[1] 10 d函数并应用于'dur'列

Vectorize

并获取上述解决方案中的 gcdV <- Vectorize(function(x,y) gcd(x, y)) dt %>% mutate(new1 = gcdV(dur, lag(dur, default = dur[1])))