我需要找到一组持续时间的最大公约数 (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
我正在使用 schoolmath
库的函数 gcd
。
我循环遍历数据并将值存储在向量 v
中。
最后,我使用 v
的 min
来查找数据的 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
。
有什么线索吗?
最佳答案
我们可以使用rowwise
在获取'dur的lag
后对每一行应用gcd
函数,提取'new1'并获取分钟
dt %>%
mutate(dur1 = lag(dur, default = dur[1])) %>%
rowwise() %>%
mutate(new1 = gcd(dur, dur1)) %>%
.$new1 %>%
tail(.,-1) %>%
min
#[1] 10
或者我们创建“gcd”的Vectorize
d 函数并应用于“dur”列
gcdV <- Vectorize(function(x,y) gcd(x, y))
dt %>%
mutate(new1 = gcdV(dur, lag(dur, default = dur[1])))
并按照上述解决方案获取min
。
关于R - 最大公约数 dplyr 例程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38943005/