varias superponer studio modificar lineas histogramas graficos graficas ejes r integer division

studio - superponer graficas en r



Función que divide un número en n entero con la aplicación. mismo tamaño (3)

Esto debería funcionar:

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

Tengo un número, por ejemplo 10 . Quiero dividir este número en 5 enteros utilizando algo como esto:

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

Esto funciona hasta que x no sea un múltiplo de n :

foo(10, 3) [1] 3.333333 3.333333 3.333333

En este caso, me gustaría una salida como.

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

La diferencia entre cada entero debe ser mínima. Entonces este resultado no está permitido:

[1] 2 5 3

Hasta ahora estoy usando esta función, pero no estoy seguro si esto siempre es correcto:

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 }


Esto pensé que era una pregunta intrigante. Descubrí que el resto indica la cantidad de números (cociente + 1) que tiene. Por ejemplo:

17/7 = 2 + 3/7 -> Entonces necesitas (7- 3 ) x 2 y 3 x (2 + 1)

19/7 = 2 + 5/7 -> Entonces necesitas (7- 5 ) x 2 y 5 x (2 + 1)

Llevando a una solución más elegante:

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


Su función debería funcionar, pero dará una respuesta diferente cada vez. También es probable que desee utilizar la división euclidiana para eso, que es lo que intenta mimcik con floor y Diff . En R obtienes el cociente con %/% y el resto con %% Así que una solución simple podría ser

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) }