Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
求使比率保持在R中的最小整数向量_R_Vector_Greatest Common Divisor - Fatal编程技术网

求使比率保持在R中的最小整数向量

求使比率保持在R中的最小整数向量,r,vector,greatest-common-divisor,R,Vector,Greatest Common Divisor,我正在寻找一个用于列表或向量的函数,该函数通过以下方式“规范化”其值: 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

我正在寻找一个用于列表或向量的函数,该函数通过以下方式“规范化”其值: 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
编辑:: 编辑::
有点困惑,为什么.3的最小整数不是1?哦,没关系,我明白你的意思。为了保持元素之间的比率-它必须是3a点困惑,为什么.3的最小整数不是1?哦,没关系,我明白你的意思。为了保持元素之间的比率-它必须是3非常感谢@onyanbu!你能解释一下吗?此外,如果其中一个元素是1/3,例如向量(1/3,1/2,1/6),它会起作用吗?我们如何详细说明你的解决方案,它会在(1/2,1/3,1/6)等情况下起作用?这不是问题所在。但是我必须考虑一下,如果你把它作为一个不同的问题来问,我恐怕他们会结束我的问题,如果它实际上是同一个问题,只有分数的表示不同..非常感谢@onyanbu!你能解释一下吗?此外,如果其中一个元素是1/3,例如向量(1/3,1/2,1/6),它会起作用吗?我们如何详细说明你的解决方案,它会在(1/2,1/3,1/6)等情况下起作用?这不是问题所在。但是我必须考虑一下,如果你把它作为一个不同的问题来问,我恐怕他们会结束我的问题,如果它实际上是同一个问题,只有分数的表示不同。。
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)
}
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