找到具有最小整数的向量以保持 R 中的比率

Finding the vector with minimal integers that keeps the ratio in R

我正在寻找适用于 "normalize" 其值的列表或向量的函数,其方式如下: 1) 找到元素的最小整数值 2) 保持元素之间的源比率。

例如:

(0.25,0.25,0.5) -> (1, 1, 2)
(0.3, 0.3, 0.4) -> (3, 3, 4)
(1/2, 1/3, 1/6) -> (2, 3, 6)

...

我们可以假设源向量元素之和为 1。 此外,向量中的元素数量不受限制。 GCD(最大公约数)或 LCD 函数在这种情况下有帮助吗?

 h=function(a){
  x=a*10**max(nchar(sub(".*\.","",a)))
  w=1:min(x)
  z=sapply(w,function(y)all(!x%%y))
  d=ifelse(!any(z),1,max(w[z]))
  x/d
 }
 h(c(0.3,0.3,0.4))
[1] 3 3 4
> h(c(0.25,0.25,0.5))
[1] 1 1 2
 h(c(0.25,0.25,0.75,0.9,0.8))
[1]  5  5 15 18 16

编辑::

Ratios=function(a){
  k=function(x)max((w<-seq(min(x)))[sapply(w,function(y)all(!x%%y))])
  l=function(x)ifelse(length(x)>2,l(c(prod(x[1:2])/k(x[1:2]),x[-(1:2)])),prod(x)/k(x))
  x=as.numeric(sub(".*\/","",as.character(MASS::as.fractions(a))))
  a*l(x)
}

k 函数查找 GREATEST COMMON DIVISOR,而 l 函数使用它查找 lcm。现在我将 a 乘以分母的 lcm

Ratios(c(1,0.5,1/3))
[1] 6 3 2
> Ratios(c(1/2,1/3,1/4))
[1] 6 4 3
> Ratios(c(1/2,1/3,1/6))
[1] 3 2 1
> Ratios(c(1/7,0.5,0.4))
[1] 10 35 28
> Ratios(c(1/7,0.5,0.4,9/10,1/9))
[1]  90 315 252 567  70