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

Isidro Hidalgo ihidalgo en jccm.es
Mar Dic 3 14:37:33 CET 2013


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



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