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

Jorge Tornero - Listas jtorlistas en gmail.com
Mar Dic 3 14:17:44 CET 2013


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



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