将数字除以n整数与app相关的函数。相同的大小

时间:2017-02-02 08:13:52

标签: r integer division

我有一个号码,例如10。我想用5这样的整数分割这个数字:

foo <- function(x, n) rep(x/n, n)
foo(10, 5)
[1] 2 2 2 2 2

直到x不是n

的多个部分,才有效
foo(10, 3)
[1] 3.333333 3.333333 3.333333

在这种情况下,我会像输出一样。

[1] 3 4 3  # the order doesn't matter. 

每个整数之间的差异必须是最小的。所以不允许这样的结果:

[1] 2 5 3

到目前为止,我正在使用此功能,但不确定这是否总是正确的:

foo <- function(x, n){ 
     res <- rep(x/n, n)
     res <- floor(res)  # rounding
     Diff <- x-sum(res)  # Difference of the sum to the input 
     gr <- sample(1:n, Diff) # select by chance as many values as `Diff` is
     res[gr] <- res[gr]+1 # plus one
     res   
  }

3 个答案:

答案 0 :(得分:1)

您的功能应该有效但每次都会给出不同的答案。你也可能想要使用Euclidian分区,这就是你试图用floorDiff进行模仿的方法。在R中,您获得的商数为%/%,余数为%% 所以一个简单的解决方案可能是

foo <- function(x,n)
{
    res=numeric(n)
    a=x%/%n # the quotient
    b=x%%n # the remainder
    res[1:n]=a # fill with the quotient
    if(b>0){
     for(i in 1:b)
        res[n-i+1]=res[n-i+1]+1 # add as many time a one in a cell as needed by the remainder
     }
    return(res)
}

答案 1 :(得分:1)

我认为这是一个有趣的问题。我发现余数表示你拥有的(商+ 1)数字。例如:

17/7 = 2 + 3 / 7 - &gt;所以你需要(7- 3 )x 2和 3 x(2 + 1)

19/7 = 2 + 5 / 7 - &gt;所以你需要(7- 5 )x 2和 5 x(2 + 1)

带来更优雅的解决方案:

  foo <- function(x,n){
     a = x%/%n # the quotient
     b = x%%n  # the remainder
     return(c(rep(a,n-b),rep(a+1,b)))
}

答案 2 :(得分:1)

这应该有效:

foo <- function(x, n) rep(x%/%n, n) + sample(c(rep(1, x %% n), rep(0, n - x %% n)), n)

foo(10, 5)
[#1] 2 2 2 2 2
foo(10, 3)
#[1] 3 3 4