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

时间:2018-03-06 18:22:50

标签: r vector greatest-common-divisor

我正在寻找适用于列表或向量的功能,以及#34;规范化"他们的价值观是这样的: 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功能可以提供帮助吗?

1 个答案:

答案 0 :(得分:4)

 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

EDIT ::

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 DIVISORl函数使用此函数查找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