Juan Abasolo
2018-Jul-07 22:25 UTC
[R-es] Completar un for, que falla al faltarle algún dato.
Buenas noches; Además del proyecto que comenté antes y con el que sigo discutiendo, también me estoy peleando con otro... con el que también tropiezo. Necesito reordenar los datos presentados en dos columnas a filas y columnas. Los datos ideales serían algo así: Ques <- c(rep("Q1",3),rep("Q2",3),rep("Q3",3)) Info <- rep(c("aca", "ahi", "alla"),3) Answ <- c("casa", "bulo", "hogar", "mama", "mami", "vieja", "perro", "can", "rope") df.raw <- data.frame(ID, Ques, Info, Answ) Pero, como no son ideales, se parecen a esto: df.raw1 <- df.raw[-2,] # Necesito un dataframe con una estructura así: df.ok <- data.frame(matrix(ncol = length(levels(df.raw$Ques)), nrow length(levels(df.raw$Info)))) names(df.ok) <- levels(df.raw$Ques) rownames(df.ok) <- levels(df.raw$Info) # que incluya los datos de 'Answ' en donde correspondería J <- levels(df.raw$Ques) K <- levels(df.raw$Info) # El ideal me queda resuelto con esto: for (j in J){ sdf <- subset(df.raw, df.raw$Ques==j) for(k in K){ x <- sdf[which(sdf$Info==k), "Answ"] df.ok[k,j] <- as.character(x) } } Pero si en la segunda linea sustituyo df.raw por df.raw1 for (j in J){ sdf <- subset(df.raw1, df.raw1$Ques==j) for(k in K){ x <- sdf[which(sdf$Info==k), "Answ"] df.ok[k,j] <- as.character(x) } } , ahí me da error. ¿Hay alguna forma de que asigne "" o NA o algo a quitar luego? O packete que haga el trabajo u orden para salvar lo que venía haciendo yo? Presupongo que será otra de esas respuestas evidentes, y disculpen lo largo de la exposición. Desde ya, muchas gracias -- Juan Abasolo Hizkuntzaren eta Literaturaren Didaktika Saila Bilboko Hezkuntza Fakultatea Euskal Herriko Unibertsitatea UPV/EHU Sarriena auzoa z/g 48940 Leioa Bizkaia [[alternative HTML version deleted]]
Carlos Ortega
2018-Jul-07 23:54 UTC
[R-es] Completar un for, que falla al faltarle algún dato.
Hola, Aparece un problema porque en en el primer subset (sdf) hay algunos valores de K que no existen. Una forma de "protegerse" es esta, incluyendo un "NA" cuando eso ocurre... for (j in J){ print(j) sdf <- subset(df.raw1, df.raw1$Ques==j) for(k in K){ print(k) x <- sdf[which(sdf$Info==k), "Answ"] * if(length(x) == 0) { df.ok[k, j ] <- "NA" } else { df.ok[k,j] <- as.character(x) }* } } Saludos, Carlos Ortega www.qualityexcellence.es El 8 de julio de 2018, 0:25, Juan Abasolo <juan.abasolo en ehu.eus> escribió:> Buenas noches; > Además del proyecto que comenté antes y con el que sigo discutiendo, > también me estoy peleando con otro... con el que también tropiezo. > > Necesito reordenar los datos presentados en dos columnas a filas y > columnas. > > Los datos ideales serían algo así: > > Ques <- c(rep("Q1",3),rep("Q2",3),rep("Q3",3)) > Info <- rep(c("aca", "ahi", "alla"),3) > Answ <- c("casa", "bulo", "hogar", "mama", "mami", "vieja", "perro", "can", > "rope") > > df.raw <- data.frame(ID, Ques, Info, Answ) > > > Pero, como no son ideales, se parecen a esto: > > df.raw1 <- df.raw[-2,] > > # Necesito un dataframe con una estructura así: > > df.ok <- data.frame(matrix(ncol = length(levels(df.raw$Ques)), nrow > length(levels(df.raw$Info)))) > > names(df.ok) <- levels(df.raw$Ques) > rownames(df.ok) <- levels(df.raw$Info) > > # que incluya los datos de 'Answ' en donde correspondería > > J <- levels(df.raw$Ques) > K <- levels(df.raw$Info) > > # El ideal me queda resuelto con esto: > > for (j in J){ > sdf <- subset(df.raw, df.raw$Ques==j) > for(k in K){ > x <- sdf[which(sdf$Info==k), "Answ"] > df.ok[k,j] <- as.character(x) > } > } > > Pero si en la segunda linea sustituyo df.raw por df.raw1 > > for (j in J){ > sdf <- subset(df.raw1, df.raw1$Ques==j) > for(k in K){ > x <- sdf[which(sdf$Info==k), "Answ"] > df.ok[k,j] <- as.character(x) > } > } > > , ahí me da error. > > ¿Hay alguna forma de que asigne "" o NA o algo a quitar luego? O packete > que haga el trabajo u orden para salvar lo que venía haciendo yo? > > Presupongo que será otra de esas respuestas evidentes, y disculpen lo largo > de la exposición. > > Desde ya, muchas gracias > > -- > Juan Abasolo > > Hizkuntzaren eta Literaturaren Didaktika Saila > Bilboko Hezkuntza Fakultatea > Euskal Herriko Unibertsitatea > UPV/EHU > > Sarriena auzoa z/g > 48940 Leioa > Bizkaia > > [[alternative HTML version deleted]] > > _______________________________________________ > R-help-es mailing list > R-help-es en r-project.org > https://stat.ethz.ch/mailman/listinfo/r-help-es >-- Saludos, Carlos Ortega www.qualityexcellence.es [[alternative HTML version deleted]]
Javier Marcuzzi
2018-Jul-08 01:11 UTC
[R-es] Completar un for, que falla al faltarle algún dato.
Estimado Juan Abasolo Creo que no es problema de R, es de su lógica porque se confundió al explicarnos, le explico en sus datos: Si realizo en mi computadora escribo lo siguiente a partir de su código: for (j in J){ sdf <- subset(df.raw, df.raw$Ques==j) for(k in K){ x <- sdf[which(sdf$Info==k), "Answ"] df.ok[k,j] <- as.character(x) } } for (j in J){ sdf <- subset(df.raw1, df.raw1$Ques==j) for(k in K){ x <- sdf[which(sdf$Info==k), "Answ"] df.ok[k,j] <- as.character(x) } } Obtengo estos resultados: df.raw Ques Info Answ 1 Q1 aca casa 2 Q1 ahi bulo 3 Q1 alla hogar 4 Q2 aca mama 5 Q2 ahi mami 6 Q2 alla vieja 7 Q3 aca perro 8 Q3 ahi can 9 Q3 alla rope> df.raw1 Ques Info Answ 1 Q1 aca casa 3 Q1 alla hogar 4 Q2 aca mama 5 Q2 ahi mami 6 Q2 alla vieja 7 Q3 aca perro 8 Q3 ahi can 9 Q3 alla rope Ahora observe en df.raw1, en el "indice 2", no lo encontrará porque pasa de 1 a 3, usted al querer explicarnos su problema ha eliminado el valor al ordenar df.raw1 <- df.raw[-2,] La ayuda de Carlos Ortega es correcta, pero posiblemente si los datos son reales y no inventados en código como en su ejemplo, ese error lógico no aparece porque serían NA. Javier Rubén Marcuzzi El sáb., 7 jul. 2018 a las 20:54, Carlos Ortega (<cof en qualityexcellence.es>) escribió:> Hola, > > Aparece un problema porque en en el primer subset (sdf) hay algunos valores > de K que no existen. > Una forma de "protegerse" es esta, incluyendo un "NA" cuando eso ocurre... > > > > for (j in J){ > print(j) > sdf <- subset(df.raw1, df.raw1$Ques==j) > for(k in K){ > print(k) > x <- sdf[which(sdf$Info==k), "Answ"] > > > * if(length(x) == 0) { df.ok[k, j ] <- "NA" } else { df.ok[k,j] <- > as.character(x) }* > } > } > > Saludos, > Carlos Ortega > www.qualityexcellence.es > > El 8 de julio de 2018, 0:25, Juan Abasolo <juan.abasolo en ehu.eus> escribió: > > > Buenas noches; > > Además del proyecto que comenté antes y con el que sigo discutiendo, > > también me estoy peleando con otro... con el que también tropiezo. > > > > Necesito reordenar los datos presentados en dos columnas a filas y > > columnas. > > > > Los datos ideales serían algo así: > > > > Ques <- c(rep("Q1",3),rep("Q2",3),rep("Q3",3)) > > Info <- rep(c("aca", "ahi", "alla"),3) > > Answ <- c("casa", "bulo", "hogar", "mama", "mami", "vieja", "perro", > "can", > > "rope") > > > > df.raw <- data.frame(ID, Ques, Info, Answ) > > > > > > Pero, como no son ideales, se parecen a esto: > > > > df.raw1 <- df.raw[-2,] > > > > # Necesito un dataframe con una estructura así: > > > > df.ok <- data.frame(matrix(ncol = length(levels(df.raw$Ques)), nrow > > length(levels(df.raw$Info)))) > > > > names(df.ok) <- levels(df.raw$Ques) > > rownames(df.ok) <- levels(df.raw$Info) > > > > # que incluya los datos de 'Answ' en donde correspondería > > > > J <- levels(df.raw$Ques) > > K <- levels(df.raw$Info) > > > > # El ideal me queda resuelto con esto: > > > > for (j in J){ > > sdf <- subset(df.raw, df.raw$Ques==j) > > for(k in K){ > > x <- sdf[which(sdf$Info==k), "Answ"] > > df.ok[k,j] <- as.character(x) > > } > > } > > > > Pero si en la segunda linea sustituyo df.raw por df.raw1 > > > > for (j in J){ > > sdf <- subset(df.raw1, df.raw1$Ques==j) > > for(k in K){ > > x <- sdf[which(sdf$Info==k), "Answ"] > > df.ok[k,j] <- as.character(x) > > } > > } > > > > , ahí me da error. > > > > ¿Hay alguna forma de que asigne "" o NA o algo a quitar luego? O packete > > que haga el trabajo u orden para salvar lo que venía haciendo yo? > > > > Presupongo que será otra de esas respuestas evidentes, y disculpen lo > largo > > de la exposición. > > > > Desde ya, muchas gracias > > > > -- > > Juan Abasolo > > > > Hizkuntzaren eta Literaturaren Didaktika Saila > > Bilboko Hezkuntza Fakultatea > > Euskal Herriko Unibertsitatea > > UPV/EHU > > > > Sarriena auzoa z/g > > 48940 Leioa > > Bizkaia > > > > [[alternative HTML version deleted]] > > > > _______________________________________________ > > R-help-es mailing list > > R-help-es en r-project.org > > https://stat.ethz.ch/mailman/listinfo/r-help-es > > > > > > -- > Saludos, > Carlos Ortega > www.qualityexcellence.es > > [[alternative HTML version deleted]] > > _______________________________________________ > R-help-es mailing list > R-help-es en r-project.org > https://stat.ethz.ch/mailman/listinfo/r-help-es >[[alternative HTML version deleted]]
Juan Abasolo
2018-Jul-08 13:33 UTC
[R-es] Completar un for, que falla al faltarle algún dato.
Muchas gracias, Carlos y Javier. La solución a como yo estaba entendiendo el problema es la que me dió Carlos. Me queda ahora por resolver alguna cuestión de valores dobles que encuentro en mi data.frame de verdad. Pero ya estoy bien cerquita! Muchas gRacias! 2018-07-08 1:54 GMT+02:00 Carlos Ortega <cof en qualityexcellence.es>:> Hola, > > Aparece un problema porque en en el primer subset (sdf) hay algunos > valores de K que no existen. > Una forma de "protegerse" es esta, incluyendo un "NA" cuando eso ocurre... > > > > for (j in J){ > print(j) > sdf <- subset(df.raw1, df.raw1$Ques==j) > for(k in K){ > print(k) > x <- sdf[which(sdf$Info==k), "Answ"] > > > * if(length(x) == 0) { df.ok[k, j ] <- "NA" } else { df.ok[k,j] > <- as.character(x) }* > } > } > > Saludos, > Carlos Ortega > www.qualityexcellence.es > > El 8 de julio de 2018, 0:25, Juan Abasolo <juan.abasolo en ehu.eus> escribió: > >> Buenas noches; >> Además del proyecto que comenté antes y con el que sigo discutiendo, >> también me estoy peleando con otro... con el que también tropiezo. >> >> Necesito reordenar los datos presentados en dos columnas a filas y >> columnas. >> >> Los datos ideales serían algo así: >> >> Ques <- c(rep("Q1",3),rep("Q2",3),rep("Q3",3)) >> Info <- rep(c("aca", "ahi", "alla"),3) >> Answ <- c("casa", "bulo", "hogar", "mama", "mami", "vieja", "perro", >> "can", >> "rope") >> >> df.raw <- data.frame(ID, Ques, Info, Answ) >> >> >> Pero, como no son ideales, se parecen a esto: >> >> df.raw1 <- df.raw[-2,] >> >> # Necesito un dataframe con una estructura así: >> >> df.ok <- data.frame(matrix(ncol = length(levels(df.raw$Ques)), nrow >> length(levels(df.raw$Info)))) >> >> names(df.ok) <- levels(df.raw$Ques) >> rownames(df.ok) <- levels(df.raw$Info) >> >> # que incluya los datos de 'Answ' en donde correspondería >> >> J <- levels(df.raw$Ques) >> K <- levels(df.raw$Info) >> >> # El ideal me queda resuelto con esto: >> >> for (j in J){ >> sdf <- subset(df.raw, df.raw$Ques==j) >> for(k in K){ >> x <- sdf[which(sdf$Info==k), "Answ"] >> df.ok[k,j] <- as.character(x) >> } >> } >> >> Pero si en la segunda linea sustituyo df.raw por df.raw1 >> >> for (j in J){ >> sdf <- subset(df.raw1, df.raw1$Ques==j) >> for(k in K){ >> x <- sdf[which(sdf$Info==k), "Answ"] >> df.ok[k,j] <- as.character(x) >> } >> } >> >> , ahí me da error. >> >> ¿Hay alguna forma de que asigne "" o NA o algo a quitar luego? O packete >> que haga el trabajo u orden para salvar lo que venía haciendo yo? >> >> Presupongo que será otra de esas respuestas evidentes, y disculpen lo >> largo >> de la exposición. >> >> Desde ya, muchas gracias >> >> -- >> Juan Abasolo >> >> Hizkuntzaren eta Literaturaren Didaktika Saila >> Bilboko Hezkuntza Fakultatea >> Euskal Herriko Unibertsitatea >> UPV/EHU >> >> Sarriena auzoa z/g >> 48940 Leioa >> Bizkaia >> >> [[alternative HTML version deleted]] >> >> _______________________________________________ >> R-help-es mailing list >> R-help-es en r-project.org >> https://stat.ethz.ch/mailman/listinfo/r-help-es >> > > > > -- > Saludos, > Carlos Ortega > www.qualityexcellence.es >-- Juan Abasolo Hizkuntzaren eta Literaturaren Didaktika Saila Bilboko Hezkuntza Fakultatea Euskal Herriko Unibertsitatea UPV/EHU Sarriena auzoa z/g 48940 Leioa Bizkaia [[alternative HTML version deleted]]