Skip to content

[R-es] Ayuda con manipulación de datos de un data.frame

12 messages · Carlos Ortega, Jorge Tornero - Listas, Isidro Hidalgo +2 more

1 day later
#
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
#
Lo puedes hacer sin crear un vector, poniendo directamente los números de
columna:
datos.nuevos <- datos[,3:5]

Creo que el problema lo podrías tener en los nombres de los dataframes...
¿Cómo se llama tu dataframe original? ¿Qué error te da?
#
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ó:
#
Muchas gracias por la respuesta casi-instantánea.

Bien, el problema es que ese rango lo tengo que volver a usar múltiples 
veces después, con lo cual me ocnvendría que fuera dinámico, por así 
decirlo, ya que el dataframe, dpendiendo de los datos de entrada, 
contendrá diferente número de columnas.

mi dataframe original se llama p y la salida de str(p) da:

str(p)
'data.frame':    9181 obs. of  219 variables:

el error de, por ejemplo

rangoAnalisis<-c(colIniAnalisis:columnaCorte)
s<-p[,rangoAnalisis]

es:

Error en `[.data.frame`(p, , rangoAnalisis) : undefined columns selected


Un saludo

El 03/12/13 13:40, Isidro Hidalgo escribió:
#
Por el error que te da, me huele que le estás metiendo un texto a través de
"colIniAnalisis" o de "columnaCorte", como te dice Carlos.
Para estar seguro:
str(colIniAnalisis)
str(columnaCorte)
Si son números te tendría que funcionar, incluso aunque fueran de coma
flotante R te los pasa a enteros...
Un saludo

Isidro Hidalgo Arellano
Observatorio Regional de Empleo
Consejería de Empleo y Economía
ihidalgo en jccm.es
http://www.jccm.es
#
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ó:
#
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
#
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ó:
#
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.:
[1] 3 4 5 6 7 8 9
int [1:7] 3 4 5 6 7 8 9
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
#
No puede ser lo de la coma flotante. P.e., la expresión siguiente "funciona":

iris[2.1:4.5,]

Lo más probable es que el rango de selección exceda el de las columnas
por algún motivo, como en
Error in `[.data.frame`(iris, , 6:7) : undefined columns selected

Un saludo,

Carlos J. Gil Bellosta
http://www.datanalytics.com