Foro de debate

Suma de elementos en un vector

Suma de elementos en un vector

by Francisco Narvaez -
Number of replies: 5

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.

In reply to Francisco Narvaez

Re: Suma de elementos en un vector

by Manuel Muñoz Márquez -

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.

In reply to Manuel Muñoz Márquez

Re: Suma de elementos en un vector

by Francisco Narvaez -
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?

In reply to Francisco Narvaez

Re: Suma de elementos en un vector

by Manuel Muñoz Márquez -

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.

In reply to Manuel Muñoz Márquez

Re: Suma de elementos en un vector

by Francisco Narvaez -
Buenas tardes.


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

In reply to Francisco Narvaez

Re: Suma de elementos en un vector

by Manuel Muñoz Márquez -

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.