R - 最大公约数 dplyr 例程

标签 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 

我正在使用 schoolmath 库的函数 gcd。 我循环遍历数据并将值存储在向量 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

有什么线索吗?

最佳答案

我们可以使用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”的Vectorized 函数并应用于“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/

相关文章:

r - 如何删除每列具有最大 2 值的行并使左侧数据框尽可能长?

python - Python 中是否有等同于 R apply 函数的函数?

r - 在 R 中禁用 GUI、图形设备

r - 获取一行中的第一个非 NA 元素

r - 如何在 R 中按一个变量对数据帧进行排序,同时对其他变量进行分组

r - 使用 R 更新 map() 循环外的向量

r - 带R的点云覆盖的区域

r - 合并两个数据帧,但表示两个数据帧中都存在的列

r - ggplot2 图的子集数据

r - 为什么 'neutral' 括号会导致 R 中的错​​误(或者可能是 tidyverse)?