Documente Academic
Documente Profesional
Documente Cultură
Bucles anidados en R
Formulada hace 1 año y 6 meses Activa hace 1 año y 6 meses Vista 773 veces
df1
2
COD LON LAT ALT
C037 -289.976 432.165 162
E000 -274.107 430.783 218
C068 -228.623 428.395 596
df2 #Tantos datos por COD como fechas (que están contenidas en el df3)
C037 C038 G0E7 G0E9 G0EA G0F0 G0F4 G0E5 G0B6 G0C1
-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999
1.456 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999
-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999
-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999
Date
01/01/2000
02/01/2000
03/01/2000
04/01/2000
05/01/2000
06/01/2000
07/01/2000
08/01/2000
09/01/2000
10/01/2000
11/01/2000
12/01/2000
13/01/2000
14/01/2000
Tengo que hacer un bucle para crear una matriz final que contenga
Así sucesivamente
Al usar este rellenar
sitio, reconoces haber leidolos registros nuestra
y entendido del df2Política
para cada día hasta
de Cookies el 31/12/2015.
, Política de Privacidad, y nuestros
Términos de Servicio.
https://es.stackoverflow.com/questions/164497/bucles-anidados-en-r 1/8
12/11/2019 Bucles anidados en R - Stack Overflow en español
Estoy intentando algo así, pero sinceramente no sé si está bien o no, nunca he hecho este tipo de
cosas en R
for (i in 1:nrow(df1))
for (j in 1:ncol(df2)){
if (df1(i,1)==(df2(1,j)){ #Esto es, si el COD del df1 coincide con el COD del
df 2 (que estaría en la fila 1, columna 1), entonces que tome los valores
registrados en el df2
print ("i is 1", "1 is j")
En este punto no sé cómo indicarle que tome los registros de las fechas y los añada a la matriz...
Tampoco sé cómo hacer para indicarle al programa que cuando tenga que tomar el siguiente COD,
me añanda nuevamente las fechas desde 01/01/2000 sin machacarme las que ya tiene registradas
antes.
Espero que entiendan lo que quiero decir y lo que debo conseguir al final. Gracias por la ayuda que
me puedan dar.
r bucle-for bucles
Hola Carolina, bienvenida. ¿Necesitas forzosamente hacerlo con un bucle por algún otro motivo? Si en cada
data.frame tienes una columna con un código que está presente en los demás, una alternativa mucho mejor
sería hacer una operación que se llama join. La función base merge , debería ser muy fácil de escribir y no
tendrías que reinventar la rueda... De nuevo, bienvenida. – mpaladino el 15 may. 18 a las 14:14
Si, tengo que usar un bucle con sentencias condicionales pero estoy super perdida. if (df1(i,1)==(df2(1,j)) Este
paso no me sale, me da error... – Caro el 16 may. 18 a las 10:43
3 respuestas
1 library(tidyverse)
dt1<-tribble(
~COD , ~LON, ~LAT, ~ALT,
"C037", -289.976, 432.165, 162,
"E000", -274.107, 430.783, 218,
Al usar este sitio,
"C038",reconoces haber leido
-228.623, y428.395,
entendido nuestra Política de
596#Agregue Cookies, Política de Privacidad, y nuestros
C038
)
Términos de Servicio.
https://es.stackoverflow.com/questions/164497/bucles-anidados-en-r 2/8
12/11/2019 Bucles anidados en R - Stack Overflow en español
dt2<-tribble(#una parte de tu ejemplo
~C037, ~C038,
-9999, -9999,
1.456, -9999,
-9999, -9999,
-9999, -9999
)
dt3<-tribble(
~Date,
"01/01/2000",
"02/01/2000",
"03/01/2000",
"04/01/2000"
)
dt4<-cbind(dt3,dt2)
dt4
Date C037 C038
1 01/01/2000 -9999.000 -9999
2 02/01/2000 1.456 -9999
3 03/01/2000 -9999.000 -9999
4 04/01/2000 -9999.000 -9999
#Se puede usar full join para unir todos los datos pero quedarian sin fecha
full_join(dt4,dt1,"COD")
Date COD VALUE LON LAT ALT
1 01/01/2000 C037 -9999.000 -289.976 432.165 162
2 02/01/2000 C037 1.456 -289.976 432.165 162
3 03/01/2000 C037 -9999.000 -289.976 432.165 162
4 04/01/2000 C037 -9999.000 -289.976 432.165 162
5 01/01/2000
Al usar este C038
sitio, reconoces -9999.000
haber -228.623nuestra
leido y entendido 428.395 596 de Cookies, Política de Privacidad, y nuestros
Política
6 02/01/2000 C038 -9999.000 -228.623 428.395 596
Términos7de03/01/2000
Servicio. C038 -9999.000 -228.623 428.395 596
https://es.stackoverflow.com/questions/164497/bucles-anidados-en-r 3/8
12/11/2019 Bucles anidados en R - Stack Overflow en español
8 04/01/2000 C038 -9999.000 -228.623 428.395 596
9 <NA E000 NA -274.107 430.783 218
Si te obligan que lo hagas con bucles y condicionales es posible. Coincido que un join es la mejor
opción, pero se puede hacer con estructuras de control explícitas.
1
Los datos
Sería muy importante que confirmes que tus datos tienen la estructura que los que se están
usando de ejemplo y test en este hilo. Por "la misma estructura" me refiero a que tienen las
mismas filas y columnas con el mismo tipo de datos en cada una. Caso contrario el código no va
a funcionar.
Retomo los datos que creó Rolando, aunque le cambio los nombres.
library(tidyverse)
La insistencia en que un join es mejor que un bucle va a estar clara acá: uno de los problemas de
los bucles es que tenés "decir" explícitamete qué hacer en cada paso y luego dónde y cómo ir
guardando el resultado. Por eso corresponden a un paradigma de programación imperativo. El join
sería una operación del paradigma declarativo, le indicas a tu función cuál es el resultado que
buscas
Al usar este sitio,yreconoces
la funcionhaber
se enarga
leido y del trabajonuestra
entendido engorroso.
Política de Cookies, Política de Privacidad, y nuestros
Términos de Servicio.
Ahora bien, ¿por qué no funciona tu bucle?
https://es.stackoverflow.com/questions/164497/bucles-anidados-en-r 4/8
12/11/2019 Bucles anidados en R - Stack Overflow en español
1. Tiene problemas de sintaxis. Le faltan algunos símbolos para ordenar el código y el intérprete
semántico (parser) de R se pierde y no sabe que hacer. La sintaxis básica de un bucle for es:
Dada esta sintaxis a tu código le faltan una llave { abriendo dentro del primer bucle y dos llaves }
cerrando al final. Eso sin contar las llaves del if .
2. El subset o creación de subconjuntos de datos en R se hace -entre otras maneras, pero esta es
la más usual- con los símbolos [ ] , corchetes. En la línea tres de tu código estás usando
paréntesis ( ) . Al usar paréntesis le estás diciento a R que lo que está detrás es una función,
no una estructura de datos. Entonces R intenta ejecutar la función df1 con los argumentos
(i, 1) . Obviamente falla, porque no existe tal función.
En la solución de más abajo eso es lo que hacen los cbind() y rbind() de x , y , z y out , ir
armando paso a paso el output final.
Voy a crear el bucle dentro de una función, para no modificar ni crear estructuras temporales en el
entorno global. La funcion se va a llamar unir y sirve solamente para est problema u otro
exactamente igual. La idea de esto de ver cuan penoso es solucionar este problema con bucles y
cuanto más vale la pena invertir tiempo en aprender a usar joins que escribir un bucle que haga lo
mismo.
No soluciona el problema de las fechas, para eso abría que abrir otro for y otro if . Ya es
suficientemente complicado como está.
Al usar este sitio, reconoces haber leido y entendido nuestra Política de Cookies, Política de Privacidad, y nuestros
No dudo que haya una mejor manera de hacerlo con bucles, pero de todos modos no tiene caso
Términos de Servicio.
mejorarlo, los bucles son una solución suboptima desde cualquier punto de vista.
https://es.stackoverflow.com/questions/164497/bucles-anidados-en-r 5/8
12/11/2019 Bucles anidados en R - Stack Overflow en español
# Resultado
Conclusión
merge y join sí, bucles no .
Me genera algo así como fichero de salida..... X.COD. X.LON. X.LAT. X.ALT. X.y.k.. 1 COD LON LAT ALT y[k] 2
COD LON LAT ALT y[k] 3 COD LON LAT ALT y[k] – Caro el 18 may. 18 a las 11:02
En general, en R se suele tratar de evitar el uso de los ciclos explícitos, es decir el for o el while ,
para ciertas operaciones. Esto, por que en muchos casos, resulta mucho más performante, sencillo
0 y claro, trabajar directamente con la funcionalidad base del lenguaje que ya está preparada para las
manipulaciones
Al usar este que
sitio, reconoces deberemos
haber que hacer.
leido y entendido nuestra Política de Cookies, Política de Privacidad, y nuestros
Términos de Servicio.
https://es.stackoverflow.com/questions/164497/bucles-anidados-en-r 6/8
12/11/2019 Bucles anidados en R - Stack Overflow en español
En primer lugar vamos a importar los datos de tu ejemplo. Achiqué un poco la muestra para que
todos los data.frame sean consistentes entre sí y para que el ejemplo quede más claro:
# Achicamos la muestra para que sea consistente con los códigos en df1
df2 <- read.table(text="C037 E000 C068
-1999 -9999 -9991
1.456 -9998 -9992
-2999 -9997 -9993
-3999 -9996 -9994", header= T, stringsAsFactors=F)
# Dejamos solo 4 valores de fecha para que sea consistente con las 4 filas de
df2
df3 <- read.table(text="Date
01/01/2000
02/01/2000
03/01/2000
04/01/2000", header= T, stringsAsFactors=F)
La solución
#Renombramos valores de columnas y nos quedamos con las que nos interesan
df4$COD=colnames(df2)[df4$time]
df4 <- df4[, c(1, 5, 3)]
df_final
Explicación:
Como se vé, convertimos todo lo que era columna en fila, y ahora es bien sencillo, aplicar un
merge() para "combinar" df1 y df4 , la salida final:
Al usar este sitio, reconoces haber leido y entendido nuestra Política de Cookies, Política de Privacidad, y nuestros
Términos de Servicio.
https://es.stackoverflow.com/questions/164497/bucles-anidados-en-r 8/8