我正在寻找适用于列表或向量的功能,以及#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功能可以提供帮助吗?
答案 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
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