找到具有最小整数的向量以保持 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
我正在寻找适用于 "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