Alberto Soria
2013-Dec-05 12:08 UTC
[R-es] Ampliar data.frame con datos del propio data.frame
¡Hola a todos! Tengo el siguiente data.frame: p <- data.frame(id=c(1:6),cara=c(1,0,0,1,0,0),anterior=c(0,1,2,0,4,5),siguiente=c(2,3,0,5,6,0),superficie=c(1,2,0,1,2,0)) En realidad es muchísimo más grande, pero creo que las primeras filas servirán para explicar mi problema. El data.frame contiene los puntos de intersección entre fotones y superficies. Dichos puntos están identificados con el campo "id". Por otro lado, el campo "siguiente" indica cual es el id de la siguiente intersección. Mi problema es que necesito crear una nueva columna llamada, por ejemplo, superficie_siguiente, que indique cual será la superficie de la siguiente intersección. Cuando la "siguiente" es igual a 0 significa que no hay nuevas intersecciones y se pondría en superficie_siguiente, por ejemplo NA. Lo he hecho con el siguiente bucle, pero es lentísimo. surface_n <- function(p,p.s,n) { if(p[n,]$siguiente != 0) p.s[n,]$superficie_siguiente <- p[p$id==p[n,]$siguiente,]$superficie return(p.s) } p.s <- cbind(p,superficie_siguiente = rep(NA,dim(p)[1])) for(n in 1:dim(p)[1]) { p.s <- surface_n(p,p.s,n) } ¿Alguna idea de cómo se puede hacer esto más rápido? Gracias por adelantado, Alberto. [[alternative HTML version deleted]]
Carlos J. Gil Bellosta
2013-Dec-05 12:22 UTC
[R-es] Ampliar data.frame con datos del propio data.frame
Hola, ¿qué tal? Lo que quieres es un "left join". Usa merge. Un saludo, Carlos J. Gil Bellosta http://www.datanalytics.com El día 5 de diciembre de 2013 13:08, Alberto Soria <alberto.soria en ari-solar.es> escribió:> ¡Hola a todos! > > Tengo el siguiente data.frame: > > p <- > data.frame(id=c(1:6),cara=c(1,0,0,1,0,0),anterior=c(0,1,2,0,4,5),siguiente=c(2,3,0,5,6,0),superficie=c(1,2,0,1,2,0)) > > En realidad es muchísimo más grande, pero creo que las primeras filas > servirán para explicar mi problema. > > El data.frame contiene los puntos de intersección entre fotones y > superficies. Dichos puntos están identificados con el campo "id". Por otro > lado, el campo "siguiente" indica cual es el id de la siguiente > intersección. Mi problema es que necesito crear una nueva columna llamada, > por ejemplo, superficie_siguiente, que indique cual será la superficie de > la siguiente intersección. Cuando la "siguiente" es igual a 0 significa que > no hay nuevas intersecciones y se pondría en superficie_siguiente, por > ejemplo NA. > > Lo he hecho con el siguiente bucle, pero es lentísimo. > > surface_n <- function(p,p.s,n) { > if(p[n,]$siguiente != 0) p.s[n,]$superficie_siguiente <- > p[p$id==p[n,]$siguiente,]$superficie > return(p.s) > } > > p.s <- cbind(p,superficie_siguiente = rep(NA,dim(p)[1])) > > for(n in 1:dim(p)[1]) { > p.s <- surface_n(p,p.s,n) > } > > ¿Alguna idea de cómo se puede hacer esto más rápido? > > Gracias por adelantado, > Alberto. > > [[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 >
miguel.angel.rodriguez.muinos en sergas.es
2013-Dec-05 12:40 UTC
[R-es] V Jornadas de Usuarios de R (Zaragoza)
Hola. En la web de las Jornadas (http://r-es.org/5j) está publicado el Programa completo (http://r-es.org/Programa+de+las+V+Jornadas) y en breve aparecerá publicado el Libro de Resúmenes. Comprobaréis que la agenda es muy completa e interesante, en caso de que todavía no lo hayáis hecho, y si tenéis la posibilidad, os animo a que asistáis a las V Jornadas de Usuarios. Un Saludo, _____________________________ Miguel Ángel Rodríguez Muíños Coordinador del Comité Científico V Jornadas de Usuarios de R http://r-es.org/5j ________________________________ Nota: A información contida nesta mensaxe e os seus posibles documentos adxuntos é privada e confidencial e está dirixida únicamente ó seu destinatario/a. Se vostede non é o/a destinatario/a orixinal desta mensaxe, por favor elimínea. A distribución ou copia desta mensaxe non está autorizada. Nota: La información contenida en este mensaje y sus posibles documentos adjuntos es privada y confidencial y está dirigida únicamente a su destinatario/a. Si usted no es el/la destinatario/a original de este mensaje, por favor elimínelo. La distribución o copia de este mensaje no está autorizada. See more languages: http://www.sergas.es/aviso_confidencialidad.htm
Alberto Soria
2013-Dec-05 13:10 UTC
[R-es] Ampliar data.frame con datos del propio data.frame
¡Gracias Carlos, como siempre! No había caído en que podía hacer merge sobre el mismo data.frame merge(p,p,by.x="id",by.y="anterior",all=T)[,c(-6:-8)] Un saludo, Alberto El 5 de diciembre de 2013 13:22, Carlos J. Gil Bellosta < cgb@datanalytics.com> escribió:> Hola, ¿qué tal? > > Lo que quieres es un "left join". Usa merge. > > Un saludo, > > Carlos J. Gil Bellosta > http://www.datanalytics.com > > El día 5 de diciembre de 2013 13:08, Alberto Soria > <alberto.soria@ari-solar.es> escribió: > > ¡Hola a todos! > > > > Tengo el siguiente data.frame: > > > > p <- > > > data.frame(id=c(1:6),cara=c(1,0,0,1,0,0),anterior=c(0,1,2,0,4,5),siguiente=c(2,3,0,5,6,0),superficie=c(1,2,0,1,2,0)) > > > > En realidad es muchísimo más grande, pero creo que las primeras filas > > servirán para explicar mi problema. > > > > El data.frame contiene los puntos de intersección entre fotones y > > superficies. Dichos puntos están identificados con el campo "id". Por > otro > > lado, el campo "siguiente" indica cual es el id de la siguiente > > intersección. Mi problema es que necesito crear una nueva columna > llamada, > > por ejemplo, superficie_siguiente, que indique cual será la superficie de > > la siguiente intersección. Cuando la "siguiente" es igual a 0 significa > que > > no hay nuevas intersecciones y se pondría en superficie_siguiente, por > > ejemplo NA. > > > > Lo he hecho con el siguiente bucle, pero es lentísimo. > > > > surface_n <- function(p,p.s,n) { > > if(p[n,]$siguiente != 0) p.s[n,]$superficie_siguiente <- > > p[p$id==p[n,]$siguiente,]$superficie > > return(p.s) > > } > > > > p.s <- cbind(p,superficie_siguiente = rep(NA,dim(p)[1])) > > > > for(n in 1:dim(p)[1]) { > > p.s <- surface_n(p,p.s,n) > > } > > > > ¿Alguna idea de cómo se puede hacer esto más rápido? > > > > Gracias por adelantado, > > Alberto. > > > > [[alternative HTML version deleted]] > > > > > > _______________________________________________ > > R-help-es mailing list > > R-help-es@r-project.org > > https://stat.ethz.ch/mailman/listinfo/r-help-es > > >[[alternative HTML version deleted]]