[R-es] seleccionar columnas de un dataframe mediante variables

Isidro Hidalgo ihidalgo en jccm.es
Mar Dic 3 14:54:36 CET 2013


XD... gajes del oficio. Te lo había dicho Carlos en el mensaje anterior...
Un saludo


Isidro Hidalgo Arellano
Observatorio Regional de Empleo
D.G. de Desarrollo de Estrategia Económica y Asuntos Europeos
Avenida de Irlanda, 14
Tlf.: 925 28 80 98              ihidalgo en jccm.es
Consejería de Empleo y Economía
http://www.jccm.es





> -----Mensaje original-----
> De: Jorge Tornero - Listas [mailto:jtorlistas en gmail.com]
> Enviado el: martes, 03 de diciembre de 2013 14:44
> Para: Isidro Hidalgo
> Asunto: Re: [R-es] seleccionar columnas de un dataframe mediante
> variables
>
> Hola a todos,
>
> es más sencillo que todo eso. El error de R "undefined columns
> selected"
> se ha de interpretar como, por ejemplo "list index out of range"
>
> Al calcular el número final me paso en 1 y claro, se tira de una
> columna que no existe.
>
> Lamento haberos dado la paliza... pero ese mensaje de error me hacía
> pensar en otra cosa...
>
> Muchas gracias por vuestra ayuda
>
>
> Jorge Tornero
>
>
>
>
>
> El 03/12/13 14:37, Isidro Hidalgo escribió:
> > Cuando haces...
> > colIniAnalisis <- ncol(p.grupos)+ncol(p.pesos.ord)+2
> > ...sumas 2 al número de columnas de los dataframes pierdes el tipo
> "integer"
> > y conviertes "colIniAnalisis" a coma flotante.
> > Cuando construyes el rango ya no tienes enteros y no funciona. En
> > teoría debería, pero no lo hace. Quizá alguien te pueda explicar por
> > qué no funciona...
> > Prueba con rangoAnalisis<-as.integer(colIniAnalisis:columnaCorte).
> > ¿Ahora sí?
> > Un saludo
> >
> > P.D.:
> >> a=3
> >> b=9
> >> a:b
> > [1] 3 4 5 6 7 8 9
> >> str(a:b)
> >   int [1:7] 3 4 5 6 7 8 9
> >> str(a:b + 2)
> >   num [1:7] 5 6 7 8 9 10 11
> >
> > Isidro Hidalgo Arellano
> > Observatorio Regional de Empleo
> > Consejería de Empleo y Economía
> > http://www.jccm.es
> >
> >
> >> -----Mensaje original-----
> >> De: r-help-es-bounces en r-project.org [mailto:r-help-es-bounces en r-
> >> project.org] En nombre de Jorge Tornero - Listas Enviado el: martes,
> >> 03 de diciembre de 2013 14:18
> >> Para: r-help-es en r-project.org
> >> Asunto: Re: [R-es] seleccionar columnas de un dataframe mediante
> >> variables
> >>
> >> Pues este es el culpable... como soy nuevo en esto, disculpad si las
> >> estrategias de creación de datframes, etc. son poco ortodoxas. Y por
> >> cierto... esto del slicing con R es un poco... duro
> >>
> >> library(RPostgreSQL)
> >> library(reshape)
> >> #CARGA DE DATOS
> >> conn<-dbConnect("PostgreSQL",dbname="OFIDAT",user="antares")
> >> #consulta<-dbSendQuery(conn,"select
> >> codigo_buque,coalesce(fecha_desembarque,fecha_regreso)::date
> >> #                      as fecha,al3_code,peso::numeric from DPCERCO
> >> where peso>0;")
> >>
> >> # PESOS y MAREAS
> >> consulta<-dbSendQuery(conn,"select
> >>                         idmarea,
> >>                         codigo_buque,
> >>                         al3_code,
> >>                         peso
> >>                         FROM
> >>                         DPCERCO
> >>                         where
> >>                         peso>0 order by idmarea,codigo_buque;")
> >>
> >>
> >> dpcerco<-fetch(consulta,-1)
> >>
> >> #Con porcentajes e idmarea
> >> p.ini<-cast(dpcerco, idmarea+codigo_buque ~ al3_code,sum)
> >>
> >>
> >> #Ahora vamos a modificar p.ini para dejarla con las columnas
> >> ordenadas según importancia en peso #Primero dividimos p.ini en
> >> campos genericos (barco y fecha) y campos con valores (especies)
> >> p.grupos<-p.ini[1:2] p.pesos<-p.ini[-(1:2)]
> >>
> >> #Definimos criterio de ordenacion (es un vector con las suma total
> >> por
> >> especie)
> >> criterio <- apply(p.pesos, 2, sum, na.rm=TRUE)
> >>
> >> #Aplicamos el criterio de ordenación
> >> p.pesos.ord<-p.pesos[,order(-criterio)] #Simbolo negativo para
> >> ordenar de mayor a menor
> >>
> >> #CREACION DE TABLA CON PORCENTAJOS
> >>
> >> # 1) Cogemos los nombres de las columnas originales:
> >> nombresColumna <- colnames(p.pesos.ord)
> >>
> >> # 2) Le añadimos a cada nombre el sufijo _peso para evitar
> duplicados
> >> en nombre de columna ; nuevosNombresColumna <-
> >> paste(nombresColumna,'_peso')
> >>
> >> # 3) Obtenemos las sumas por fila de los pesos por marea:
> >> totalPesoMarea <- rowSums(p.pesos.ord)
> >>
> >> # 4) Creamos un dataframe nuevo con los porcentajes de las columnas
> >> que corresponda, que # conservará los nombres de columna correctos
> >> (alpha3 sin alterar) p.porcs <- p.pesos.ord/totalPesoMarea
> >>
> >> # 5) Cambiamos los nombres de columna del dataframe de pesos por los
> >> nuevos
> >> colnames(p.pesos.ord) <- nuevosNombresColumna
> >>
> >> # 6) Ahora obtenemos lo que será en el futuro la columna inicial de
> >> las especies en porcentaje
> >> #    (sumamos 2 para tener en cuenta la columna de suma que
> obtenemos
> >> en
> >> el siguiente paso)
> >>
> >> colIniAnalisis <- ncol(p.grupos)+ncol(p.pesos.ord)+2
> >>
> >> # 6) Ahora ya es posible juntar todo para tener la tabla final (
> >>
> >> p <- cbind(p.grupos,p.pesos.ord,totalPesoMarea,p.porcs)
> >>
> >> #La variable numero especies indica el número de especies a usar en
> >> el análisis.
> >> # Como las especies están ordenadas, cuando decidamos quedarnos con
> >> las X primeras especies # simplemente establecemos numeroEspecies<-X
> >> numeroEspecies<-110 columnaCorte<-colIniAnalisis+numeroEspecies
> >>
> >> #En lugar de estar siempre cambiando varios parámetros,
> centralizamos
> >> el rango de columnas para CLARA # en esta variable
> >> rangoAnalisis<-c(colIniAnalisis:columnaCorte) <<<-
> >>
> >>
> >>
> >> Muchas gracias por vuestra ayuda
> >>
> >> El 03/12/13 14:17, Isidro Hidalgo escribió:
> >>> Chico, me quedo a cuadros. Algún fiera de por aquí te dirá por qué,
> >> pero yo
> >>> a bote pronto no tengo ni idea... Si nos puedes poner el código con
> >> el que
> >>> se originan ese par de variables quizá podamos ver algo...
> >>> Un saludo
> >>>
> >>>
> >>> Isidro Hidalgo Arellano
> >>> Observatorio Regional de Empleo
> >>> D.G. de Desarrollo de Estrategia Económica y Asuntos Europeos
> >>> Avenida de Irlanda, 14
> >>> Tlf.: 925 28 80 98              ihidalgo en jccm.es
> >>> Consejería de Empleo y Economía
> >>> http://www.jccm.es
> >>>
> >>>
> >>>
> >>>
> >>>> -----Mensaje original-----
> >>>> De: r-help-es-bounces en r-project.org [mailto:r-help-es-bounces en r-
> >>>> project.org] En nombre de Jorge Tornero - Listas Enviado el:
> >>>> martes, 03 de diciembre de 2013 14:09
> >>>> Para: Carlos J. Gil Bellosta
> >>>> CC: r-help-es
> >>>> Asunto: Re: [R-es] seleccionar columnas de un dataframe mediante
> >>>> variables
> >>>>
> >>>> Hola a todos:
> >>>>
> >>>> Rediela!!
> >>>>
> >>>> Si hago la prueba con
> >>>>
> >>>> rangoAnalisis<-c(110:120)
> >>>>
> >>>> Funciona!!!
> >>>>
> >>>> Pero como os comenté antes, no.
> >>>> Ojo!!!
> >>>>
> >>>> La idea es que tanto columnaInicial como columnaFinal son
> >>>> números(índices) de columna!!! De hecho, haciendo el str() de
> estas
> >>>> variables me indica que son del tipo num
> >>>>
> >>>> Un saludo
> >>>>
> >>>>
> >>>>
> >>>>
> >>>> El 03/12/13 13:41, Carlos J. Gil Bellosta escribió:
> >>>>> Hola, ¿qué tal?
> >>>>>
> >>>>> ¿Qué son columnaInicial y columnaFinal? ¿Números? En tal caso,
> >>>> debería
> >>>>> funcionar lo que haces.
> >>>>>
> >>>>> Si no, tienes que convertirlos a números:
> >>>>>
> >>>>> col.ini.num <- which(colnames(datos.original) == columnaInicial)
> >>>>> col.fin.num <- which(colnames(datos.original) == columnaFinal)
> >>>>>
> >>>>> Y entonces sí que puedes crear el rango col.ini.num:col.fin.num.
> >>>>>
> >>>>> Un saludo,
> >>>>>
> >>>>> Carlos J. Gil Bellosta
> >>>>> http://www.datanalytics.com
> >>>>>
> >>>>> El día 3 de diciembre de 2013 13:30, Jorge Tornero - Listas
> >>>>> <jtorlistas en gmail.com> escribió:
> >>>>>> Buenos días a todos:
> >>>>>>
> >>>>>> Para empezar, y como este es mi primer mensaje a la lista, me
> >>>>>> presentaré. Mi nombre es Jorge Tornero y trabajo en el Instituto
> >>>>>> Español de Oceanografía como Ayudante de Investigación.  No soy
> >>>>>> usuario habitual de R pero estoy tomando contacto con él de cara
> >>>>>> a
> >>>> un proyecto en el que ando involucrado.
> >>>>>> Mi consulta es:
> >>>>>>
> >>>>>> Me interesaría poder seleccionar columnas de un dataframe, pero
> >>>>>> empleando dos variables como inicio del intervalo y fin. He
> >>>> intentado lo siguiente:
> >>>>>> rangoAnalisis<-c(columnaInicial:columnaFinal)
> >>>>>>
> >>>>>> y luego
> >>>>>>
> >>>>>> datos<-datos.original[,rangoAnalisis]
> >>>>>>
> >>>>>> Con sus variantes de paréntesis, etc... sin resultado
> >>>>>>
> >>>>>> ¿Alguna idea?
> >>>>>>
> >>>>>> Muchas gracias y un saludo
> >>>>>>
> >>>>>> Jorge Tornero
> >>>>>>
> >>>>>> _______________________________________________
> >>>>>> R-help-es mailing list
> >>>>>> R-help-es en r-project.org
> >>>>>> https://stat.ethz.ch/mailman/listinfo/r-help-es
> >>>> _______________________________________________
> >>>> R-help-es mailing list
> >>>> R-help-es en r-project.org
> >>>> https://stat.ethz.ch/mailman/listinfo/r-help-es
> >>> _______________________________________________
> >>> R-help-es mailing list
> >>> R-help-es en r-project.org
> >>> https://stat.ethz.ch/mailman/listinfo/r-help-es
> >> _______________________________________________
> >> R-help-es mailing list
> >> R-help-es en r-project.org
> >> https://stat.ethz.ch/mailman/listinfo/r-help-es
> > _______________________________________________
> > R-help-es mailing list
> > R-help-es en r-project.org
> > https://stat.ethz.ch/mailman/listinfo/r-help-es



Más información sobre la lista de distribución R-help-es