Foro de debate

Suma de elementos en un vector

 
Imagen de Francisco Narvaez
Suma de elementos en un vector
de Francisco Narvaez - lunes, 18 de febrero de 2019, 05:57
 

Buenas,


Estoy iniciando en  el uso de R y estoy tratando de montar una función haciendo uso de for, if y break. 

La función debe simular el lanzamiento de un dado tantas veces sea necesario hasta que la suma de los lanzamientos sea mayor o igual que 21. 

Lo que hice inicialmente fue crear un vector de 21 datos que generara números aleatorios.

Fue entonces cuando tuve el problema de hacer la suma dato por dato hasta llegar al objetivo de la suma en 21 o más.

Lo ideal es al final mediante “cat” mostrar cuáles fueron los valores de cada lanzamiento.

Imagen de Manuel Muñoz Márquez
Re: Suma de elementos en un vector
de Manuel Muñoz Márquez - lunes, 18 de febrero de 2019, 07:50
 

Buenas Francisco:

El uso de los for en R no es muy recomendable pues son lentos. Generalmente las cosas se pueden hacer sin usar for.

Por ejemplo:

> x <- sample.int(6, 21, replace = TRUE)
> x
 [1] 5 4 5 1 5 4 4 4 1 3 6 6 3 4 5 6 5 6 4 1 5
> s <- cumsum(x)
> min(which(s >= 21))
[1] 6

Un saludo.

Imagen de Francisco Narvaez
Re: Suma de elementos en un vector
de Francisco Narvaez - lunes, 18 de febrero de 2019, 15:12
 
Buenos días.

Aun intento utilizar el for y el break pues es para una actividad academica que quiero desarrollar.

Con su ayuda monte la siguiente función

Mediadados=function(){
  Lanz.dados=c(sample.int(6,size=21,T))
  for (i in Lanz.dados){
    Sumalanz=cumsum(Lanz.dados)
    if (cumsum(Sumalanz)>=21)break
  Dadoslanzados=min(which(Sumalanz>=21))
  }
  cat("La cantidad de veces que se lanzó el dado fueron",Dadoslanzados,"\n")
  }
Mediadados()

La función me arroja el resultado deseado sin embargo me aparece lo siguiente
There were 21 warnings (use warnings() to see them)

¿Me pueden ayudar a resolver esto?

Imagen de Manuel Muñoz Márquez
Re: Suma de elementos en un vector
de Manuel Muñoz Márquez - lunes, 18 de febrero de 2019, 18:22
 

Buenas:

Sea para lo que sea es preferible no usar el for.

El uso que haces del for y de cumsum no es apropiado.

Otras dos opciones

Mediadados <- function() {
    s <-  0
    n <- 0
    while(s <= 21) {
        s <- s + sample.int(6, size = 1)
        n <- n + 1
    }
    n
}
Mediadados2 <- function() {
    s <- 0
    n <- 0
    for(i in 1:21) {
        s <- s + sample.int(6, size = 1)
        n <- n + 1
        if (s >= 21) break
    }
    n
}

Un saludo.

Imagen de Francisco Narvaez
Re: Suma de elementos en un vector
de Francisco Narvaez - martes, 19 de febrero de 2019, 21:29
 
Buenas tardes.


Mil gracias por la ayuda. Una última pregunta en concreto ¿cual es la diferencia entre usar sample y sample.int?

Imagen de Manuel Muñoz Márquez
Re: Suma de elementos en un vector
de Manuel Muñoz Márquez - miércoles, 20 de febrero de 2019, 11:21
 

Buenas:

Te recomiendo que pidas ayuda sobre las funciones mediante

?sample
?sample.int

La primera permite muestrear sobre un conjunto de datos cualquiera, la segunda muestrea en los enteros, dicho de otra forma

sample.int(n, ...) = sample(1:n, ...)

En este caso, sample.int es más eficiente.

Un saludo.