我需要找到一组持续时间的最大公约数(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)))
。
有任何线索吗?
答案 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])))
。