Foro de debate

Iteraciones con R

Iteraciones con R

by Mikel Viñuales Lasheras -
Number of replies: 5

Buenas tardes,

Soy nuevo en este foro y también soy nuevo con el lenguaje R.

Estoy tratando de realizar unas acciones dentro de la función for. Yo normalmente programo en Python y basandome en Python estoy tratando de hacer lo siguiente.

1. Tengo un data.frame con varias columas A,B,C,D,E,a,b,c,d,e.

2. Las variables mayúsculas contienen los datos y las variables minúsculas contienen un criterio. La A mayúscula su criterio está guardado en a minúscula (así sucesivamente).

3. La operación clave que quiero realizar es analizar A y a (sucesivamente con todas variables), y a los valores de A que no cumplan el criterio asignarles NA. Posteriormente quiero ir añadiendo las nuevas columnas (A,B,C,D,E con datos NA) a un nuevo data.frame.

4. Como resultado obtendría un data.frame con las columnas A,B,C,D,E y en los valores que nos se cumplan los critérios tendré NA. Y así ya poder realizar las estadísticas de los datos que cumplen el criterio.

Estos son los datos de prueba que estoy utilizando y el script.



## Datos de prueba
A<-c(232,124,235,345,345,346)
B<-c(345,543,234,322,232,345)
C<-c(345,543,232,123,235,456)
D<-c(342,323,222,224,356,178)
E<-c(482,384,599,231,234,342)

a<-c(0,0,3,1,2,0) # si los criterios (>=2) el valor en las variables A,B,C,D,E sera NA.
b<-c(2,3,1,1,0,2)
c<-c(0,0,3,2,1,1)
d<-c(1,1,3,0,0,0)
e<-c(1,1,1,3,0,0)

df<-data.frame(A,B,C,D,E,a,b,c,d,e)
View(df)

df1<-data.frame() ## lo creo vacio para que exista en el for
k<-0
for (i in 1:5){
  k=i
  df1<-cbind(df[i],df[5+k])
  View(df1) ## unicamente me aparecen las ultimas columnas la E y e.
 
}
Dentro del for todavía me quedan funciones, pero al no hacer el primer paso bien no las he planteado.

Muchas gracias

MIKEL
In reply to Mikel Viñuales Lasheras

Re: Iteraciones con R

by Manuel Muñoz Márquez -

Buenas:

Aunque los bucles existen en R, son muy poco eficientes. En R la mayor parte de las veces el trabajo se puede hacer sin recurrir a bucles.

No entiendo que esperas obtener, ¿nos podrías poner cual es el resultado esperado para los datos que tienes?

Un saludo.

In reply to Manuel Muñoz Márquez

Re: Iteraciones con R

by Mikel Viñuales Lasheras -

Buenos días Manuel,

Como bien me comentas sí que he leído información acerca del poco uso de los bucles, pero desde mi perspectiva en este caso serían necesarios. Aunque puede darse el caso que exista una función que lo realice.

Retomando el ejemplo anterior, yo tengo dos data.frame

## Datos de prueba
A<-c(232,124,235,345,345,346)
B<-c(345,543,234,322,232,345)
C<-c(345,543,232,123,235,456)
D<-c(342,323,222,224,356,178)
E<-c(482,384,599,231,234,342)

df1<-data.frame(A,B,C,D,E)

a<-c(0,0,3,1,2,0)
b<-c(2,3,1,1,0,2)
c<-c(0,0,3,2,1,1)
d<-c(1,1,3,0,0,0)
e<-c(1,1,1,3,0,0)

df2<-data.frame(a,b,c,d,e)

Ambos data frame tienen las mismas dimensiones.

Lo que yo quiero obtener es un nuevo data.frame que cumpla las siguientes características: si el df2[i,j] es menor que 2, el elemento df1[i,j] se quedara con el valor que tiene, pero si df2[i,j] es >=2 el elemento de df1[i,j] le asignare NA.

Por ello, pensaba utilizar un for, para recorrer todas las filas y columnas (esto es usual en Python).

Gracias


MIKEL

In reply to Mikel Viñuales Lasheras

Re: Iteraciones con R

by Manuel Muñoz Márquez -

Buenas:

La siguiente líneas hacen lo que quiere con un único bucle. Seguro que dándole alguna vuelta más podríamos quitar el otro bucle.

Un saludo.

for(i in 1:ncol(df1))
    df1[i,df2[i,] < 2] = NA

df1

    A   B   C   D   E
1  NA 345  NA  NA  NA
2  NA 543  NA  NA  NA
3 235  NA 232 222  NA
4  NA  NA 123  NA 231
5 345  NA  NA  NA  NA
6 346 345 456 178 342


In reply to Manuel Muñoz Márquez

Re: Iteraciones con R

by Mikel Viñuales Lasheras -

Muchas Gracias Manuel.

La verdad que no pensaba que se pudiera hacer con un único for, yo estaba pensando en un for i para las filas y un for j anidado para las columnas.

Tengo una última pregunta: en ningun momento le estamos especificando la columna (j). Al escribir df2[i,] va pasando por todas las columnas de las filas automaticamente y guarda el número de columna correspondiente?

Gracias de nuevo


MIKEL

In reply to Mikel Viñuales Lasheras

Re: Iteraciones con R

by Manuel Muñoz Márquez -

Buenas:

df2[i,] significa la fila i. Se podría haber hecho igual por columnas.

En R cuando compara un vector con un número te devuelve un vector con valores TRUE/FALSE. Así df2[i,] < 2 devuelve un vector con TRUE/FALSE según se verifique la condición.

Cuando en un índice se especifican valores TRUE/FALSE se toman únicamente aquellos elementos del vector que cuyo índice es TRUE.

Si realmente te interesa la programación en R te recomiendo mires despacio la forma en que se trabaja en R con matrices y vectores, pues se pueden hacer cosas bastante sofisticadas utilizando únicamente operaciones con índices.

Un saludo.