Foro de debate

Bucles en R

Bucles en R

de Nerea Valcarcel -
Número de respuestas: 10
Hola a todos,

estoy intentando escribir un programa para procesar los datos de un equipo que acabamos de comprar. Como no sabía programar en ningun lenguaje pero había dado un cursito de R me animé a hacerlo con él, pero soy muy novata y estoy bastante perdida. Hasta ahora he podido "apañarme" haciendo cosas básicas a través de R-commander y modificando el código según me interesaba. Ahora sin embargo he llegado a un punto en que no sé seguir. Tengo dos problemas:

- Una de las variables (llamemosla B) algunas veces aparece con NA por fallos del equipo. Yo necesito calcular una nueva variable (C) diviendo la variable A entre la variable B. El problema es que cuando la variable B tiene NA, la variable C también, claro está y yo necesito que C sea siempre mayor de 0. Lo que creía que tenía que hacer es algo del tipo "if then else" al crear la nueva variable, de tal forma que si B es positiva me haga el cálculo necesario y si no, tome el valor de la celda anterior. He hecho numerosos intentos y me imagino que no doy con la sintaxis adecuada, porque no he sido capaz de conseguirlo.

- Por otra parte, tengo una variable con la siguiente estructura:

Variable D

32869
291
327
401
186
33251
874
215

El equipo es un contador de partículas láser, y cada vez que la variable D toma un valor superior a 32768, esto indica que es una nueva partícula. Es decir, necesito que el programa identifique cada partícula y sume los valores de D hasta el siguiente valor mayor de 32768. Llevo toda la mañana leyendo manuales, foros y demás y no consigo dar con el método más adecuado. He pensado en for, while y luego he visto que muchas veces se pueden simplificar estos bucles con apply. En definitiva, no he conseguido usar ninguno de ellos y estoy más liada que al principio.

No sé si podrán ayudarme, pero lo agradezco de antemano.

Un saludo

Nerea
En respuesta a Nerea Valcarcel

Re: Bucles en R

de Nerea Valcarcel -

Hola de nuevo,

he solucionado el primero de los dos bucles que necesitaba, así que lo pongo aquí por si a alguien le interesa.

Mi problema era que estaba intentando definir el bucle al mismo tiempo que creaba la nueva variable. Al final he creado la variable en un primer paso, y en un segundo he hecho el bucle y perfecto!

C <- numeric (1:z) #Crea una nueva variable C de longitud z

for (i in 2:z) if (datos$B[i]==NaN datos$C[i]<-datos$C[i-1] else datos$C[i]<-datos$A[i]/datos$B[i] #Si Bn=NaN entonces Cn=C(n-1) si no Cn=An/Bn

En la instrucción for el primer número en el que se aplica la fórmula es el 2 (i in 2:z), esto es porque al referenciar i-1 en la misma si el bucle empieza en 1 da error, porque no localiza un valor i=0.

Despues de las vueltas que he dado espero que a alguien le sirva de ayuda :).

Aun sigo sin solucionar el 2º bucle así que sigo aceptando cables...

Gracias!

Nerea

En respuesta a Nerea Valcarcel

Re: Bucles en R

de Manuel Muñoz Márquez -
Hola Nerea:

Lo que me dices de que no hay nadie que conozca R se me hace un poco difícil de creer. En cualquier caso ya te tienen a ti de profeta.

Me hubiera gustado contestarte antes, pero no he tenido ocasión.

Aunque los bucles existen en R su uso está desaconsejado, cuando sea posible son preferibles otras soluciones que utilicen vectores.

Creo que una solución a tu primer problema es:
> a<-c(1,2,4,8,16)
> b<-c(1,2,NA,4,NA)
> c<-a/b
> c
[1] 1 1 NA 2 NA
> c[is.na(c)] <- c[is.na(c[-1])]
> c
[1] 1 1 1 2 2

Esta solución funciona siempre que no haya NA's seguidos, si los hay bastará con repetir la última instrucción. Si lo necesitas también se puede automatizar la repetición.

De todas formas, no entiendo el motivo de sustituir el dato faltante por el anterior. Si el dato falta pues falta.

Saludos.

P.D.: Intentaré contestar también a tu segunda pregunta.





En respuesta a Manuel Muñoz Márquez

Re: Bucles en R

de Nerea Valcarcel -
Hola Manuel,

a mi también me sorprendió que no conocieran R (al menos en el grupo en que yo trabajo aquí), cuando le enseñé la página a mi supervisor de aquí se mostró muy sorprendido. Ellos trabajan con Matlab, Fortran y creo que algo de C++, pero desde luego a quienes he preguntado es la primera vez que oía hablar de R.

En cuanto a mi "caso", gracias por tu ayuda. Había visto alguna información sobre la vectorización en lugar de los bucles, pero me está costando tanto avanzar que como ya tenía una solución, había aparcado la segunda. Y lo de sustituir un NA por un dato, realmente esa variable no es la que más me interesa a mi, pero si no la tengo, no me sirven de nada los datos de las que sí me interesan de verdad. Además, se trata de una medida de flujo del contador, que éste proporciona cada 0.5s, por tanto es muy difícil que haya una diferencia importante entre un dato y el otro y la aproximación de igualarlo al anterior es una de las mejores opciones, ya que en caso de variaciones, el flujo lo hace a una escala temporal mayor.

Mañana me pongo con el segundo problema. Postearé si tengo novedades.

Gracias de nuevo,

Un saludo
En respuesta a Nerea Valcarcel

Re: Bucles en R

de Franz Jimeno -
Hola Nerea,

¿podrías poner el resultado que debería aparecer en ejemplo de la variable D que has puesto? No tengo muy claro qué es lo que quieres hacer y la solución de Manuel me ha confundido un poco.

Yo lo que entiendo es que quieres que cada vez que se llegue a un resultado >32768 se "resetee" un sumador de números. Los números que se encuentren entre los números mayores de 32768 se han de ir sumando.

Ej:

Variable D:

32869
291
327
401
186
33251
874
215

Resultado:
32869
291
618
1019
1205
33251
874
1089

¿Es así?

Un saludo,

Franz
En respuesta a Franz Jimeno

Re: Bucles en R

de Nerea Valcarcel -

Gracias por la propuesta Manuel, no es eso lo que quería, pero aun así me viene bien para un paso posterior en el programa.

Perdón si no me expliqué bien en el primer mensaje, pero como no tenía ni idea de qué es lo que hay que hacer para conseguir lo que quiero, puede que no lo dejase muy claro.

A ver, como dice Franz voy a poner lo que necesito conseguir. Necesito tener una nueva variable E con las suma de las medidas que hay entre cada valor mayor de 32768, es decir (cambio los números para que se vea más fácil)

Variable D, por ejemplo es un vector con valores (3,2,1,3, 35000,1,1,3,42300,2,1,3,2,90000)

El resultado(variable E) sería un vector mucho más corto (9,5,8)

Gracias de nuevo, estoy aprendiendo un montón.

Saludos,

Nerea

En respuesta a Nerea Valcarcel

Re: Bucles en R

de Franz Jimeno -
Hola,

te mando una manera que hace lo que dices, no se si existe alguna opción más eficiente.

contar <- function(datos){
    suma <- 0
    resultado <- vector()
    for (i in datos) {
        if(i>32768) {
            resultado <- append(resultado, suma)
            suma <- 0
        } else {
            suma <- suma+i
        }
    }
    return(resultado)
}

Una vez creada la función solo tienes que llamarla:

D <- c(3,2,1,3, 35000,1,1,3,42300,2,1,3,2,90000)

contar(D)

[1] 9 5 8

te devuelve un vector con los elementos sumados.

Un saludo,

Franz
En respuesta a Franz Jimeno

Re: Bucles en R

de Nerea Valcarcel -
Hola Franz,

muchísimas gracias por tu ayuda, es lo que necesitaba.

Un saludo

Nerea
En respuesta a Nerea Valcarcel

Re: Bucles en R

de Ricardo Kirchner Amor -
¿Alguien sabe como hacer q en R me salgan los datos de la lectura de una tabla y su correspondiente MannKendall ( función q ya sé usar)? He de leer unas 700 y de momento lo hago a mano, pero me gustaría automatizarlo.
Lo q hago es
leer tabla
asignar los valores de la matriz a un vector
PUBLICAR el nombre de la tabla
Calcular y PUBlicar el MannKendall

Muchas gracias