Hola.
Estoy intentando crear una función pero no logro que termine de cerrar y mi
manejo no permite que el google me ayude...
n.reg.dep <- function(x, y) {
etiqueta <- str_replace(nombres[Variable == y, Descripcion], "[
]", "")
tabla <- datos[, .N, by = .(etiqueta = A3a)] #
tabla <- tabla[, Porc := round(N/sum(N)*100,1)] # %
tabla[, PorcAc := cumsum(Porc)]
# Regiones
tabla.1 <- datos[, .N, by = .(etiqueta = x, Region)]
tabla.1[, Porc := round(N/sum(N)*100,1), by =.(Region)]
tabla.1 <- spread(tabla.1[, .(etiqueta, Region, Porc)], key Region,
value = Porc)
tabla.reg <- left_join(tabla, tabla.1)
# Depdendencia
tabla.1 <- datos[, .N, by = .(etiqueta = x, Dependencia = B2a)]
tabla.1[, Porc := round(N/sum(N)*100,1), by =.(Dependencia)] # %
por Dependencia
tabla.1 <- na.omit(tabla.1)
tabla.1 <- spread(tabla.1[, .(etiqueta, Dependencia, Porc)], key
= Dependencia, value = Porc)
tabla.dep <- left_join(tabla, tabla.1)
tabla <- left_join(tabla.reg, tabla.dep)
return(tabla)
}
n.reg.dep(datos$A3a, "A3a")
n.reg.dep(datos$A3a)
?Si bien anda y el resultado es bastante parecido al que espero, no puedo
hacer que las tablas se llamen como quisiera porque el factor
"etiqueta"
que debería indicar el primer nombre de la variable no es consdierado, como
podrán ver.
?Si correo el código para la variable, resulta algo
como:> tabla
Sexo N Porc PorcAc NEA NOA Nacionales Provinciales Municipales
Comunitarios Religiosos Privados
1 Mujer 270 86.8 86.8 92.7 84.2 77.8 89.6 83.8
78.9 90 100
2 Varon 40 12.9 99.7 7.3 15.3 22.2 10.4 16.2
19.3 10 NA
3 <NA> 1 0.3 100.0 NA 0.5 NA NA NA
NA NA NA?
?Pero como tengo que hacerlo muchas veces, necesitaría poder escribir esta
(mi primera) función. Ahorraría mucho tiempo, además ?de asegurarme que no
pifio en el copiar y pegar y reemplazar.
?Adjunto datos de prueba y una tabla con los las variables y sus
variable.labels (nombres).
?Se usa:
library(data.table)
library(tidyverse) # library(dplyr)
library(stringr)
Muchas gracias.
Saludos.
--
Mauricio
[[alternative HTML version deleted]]
Estimado Mauricio Monsalvo
Leí muy rápido su correo, pienso en que podría aislar problemas en distintas
funciones y que estas sean llamadas por la función general, el mantenimiento es
más fácil, porque si ahora logra lo que desea pero dentro de dos días piensa en
una mejora, al estar todo en una sola función puede caer en problemas, en cambio
si separa en varias funciones el inconveniente queda en una única función.
Por otro lado a mí me resulta más fácil probar por fragmentos de código que no
todo junto, aunque eso es muy personal y depende de las capacidades de cada uno
(yo tengo que aislar en secciónes).
Javier Rubén Marcuzzi
De: Mauricio Monsalvo
Enviado: miércoles, 15 de marzo de 2017 7:21
Para: r-help-es
Asunto: [R-es] Crear una función
Hola.
Estoy intentando crear una función pero no logro que termine de cerrar y mi
manejo no permite que el google me ayude...
n.reg.dep <- function(x, y) {
etiqueta <- str_replace(nombres[Variable == y, Descripcion], "[
]", "")
tabla <- datos[, .N, by = .(etiqueta = A3a)] #
tabla <- tabla[, Porc := round(N/sum(N)*100,1)] # %
tabla[, PorcAc := cumsum(Porc)]
# Regiones
tabla.1 <- datos[, .N, by = .(etiqueta = x, Region)]
tabla.1[, Porc := round(N/sum(N)*100,1), by =.(Region)]
tabla.1 <- spread(tabla.1[, .(etiqueta, Region, Porc)], key Region,
value = Porc)
tabla.reg <- left_join(tabla, tabla.1)
# Depdendencia
tabla.1 <- datos[, .N, by = .(etiqueta = x, Dependencia = B2a)]
tabla.1[, Porc := round(N/sum(N)*100,1), by =.(Dependencia)] # %
por Dependencia
tabla.1 <- na.omit(tabla.1)
tabla.1 <- spread(tabla.1[, .(etiqueta, Dependencia, Porc)], key
= Dependencia, value = Porc)
tabla.dep <- left_join(tabla, tabla.1)
tabla <- left_join(tabla.reg, tabla.dep)
return(tabla)
}
n.reg.dep(datos$A3a, "A3a")
n.reg.dep(datos$A3a)
?Si bien anda y el resultado es bastante parecido al que espero, no puedo
hacer que las tablas se llamen como quisiera porque el factor
"etiqueta"
que debería indicar el primer nombre de la variable no es consdierado, como
podrán ver.
?Si correo el código para la variable, resulta algo
como:> tabla
Sexo N Porc PorcAc NEA NOA Nacionales Provinciales Municipales
Comunitarios Religiosos Privados
1 Mujer 270 86.8 86.8 92.7 84.2 77.8 89.6 83.8
78.9 90 100
2 Varon 40 12.9 99.7 7.3 15.3 22.2 10.4 16.2
19.3 10 NA
3 <NA> 1 0.3 100.0 NA 0.5 NA NA NA
NA NA NA?
?Pero como tengo que hacerlo muchas veces, necesitaría poder escribir esta
(mi primera) función. Ahorraría mucho tiempo, además ?de asegurarme que no
pifio en el copiar y pegar y reemplazar.
?Adjunto datos de prueba y una tabla con los las variables y sus
variable.labels (nombres).
?Se usa:
library(data.table)
library(tidyverse) # library(dplyr)
library(stringr)
Muchas gracias.
Saludos.
--
Mauricio
[[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
[[alternative HTML version deleted]]
Gracias, Javier.
Es una buena orientación. ¿Qué criterio utilizarías para aislar las
funciones? ¿Cada una que crea un objeto es una función en sí misma, que
luego puede ser llamada por otra? Me parece más eficiente y seguro es más
sencillo de mantener, pero con poco práctica en funciones me pareció un
camino a evitar...
Aprovecho y adjunto los archivos que en el anterior no lo había hecho y
también corrijo un error de transcripción.
En este momento, más allá del interés de aprender y mejorar la forma de
encarar estos problemas (tengo más de 1500 líneas de código que puedo
resumir con esta función), el principal problema que veo es que no logro
que el objeto etiqueta, que en la segunda línea asigna un factor al
parámetro y sea luego el nombre que aparece en las variables datos[, .N, by
= .(etiqueta ?x
)], porque el data.table "nombra" esa variable como etiqueta (literal)
en
lugar de utilizar el factor ("Sexo", en el ejemplo) asignado
?a
etiqueta <- "Sexo".-
Espero se entienda...
---------- Mensaje reenviado ----------
De: Mauricio Monsalvo <m.monsalvo en gmail.com>
Fecha: 15 de marzo de 2017, 7:21
Asunto: Crear una función
Para: r-help-es <r-help-es en r-project.org>
Hola.
Estoy intentando crear una función pero no logro que termine de cerrar y mi
manejo no permite que el google me ayude...
n.reg.dep <- function(x, y) {
??
etiqueta <- str_replace(nombres[Variable == y, Descripcion], "[ ]",
"")
tabla <- datos[, .N, by = .(etiqueta ?x
)] #
tabla <- tabla[, Porc := round(N/sum(N)*100,1)] # %
tabla[, PorcAc := cumsum(Porc)]
# Regiones
tabla.1 <- datos[, .N, by = .(etiqueta = x, Region)]
tabla.1[, Porc := round(N/sum(N)*100,1), by =.(Region)]
tabla.1 <- spread(tabla.1[, .(etiqueta, Region, Porc)], key Region,
value = Porc)
tabla.reg <- left_join(tabla, tabla.1)
# Depdendencia
tabla.1 <- datos[, .N, by = .(etiqueta = x, Dependencia = B2a)]
tabla.1[, Porc := round(N/sum(N)*100,1), by =.(Dependencia)] # %
por Dependencia
tabla.1 <- na.omit(tabla.1)
tabla.1 <- spread(tabla.1[, .(etiqueta, Dependencia, Porc)], key
= Dependencia, value = Porc)
tabla.dep <- left_join(tabla, tabla.1)
tabla <- left_join(tabla.reg, tabla.dep)
return(tabla)
}
n.reg.dep(datos$A3a, "A3a")
n.reg.dep(datos$A3a)
?Si bien anda y el resultado es bastante parecido al que espero, no puedo
hacer que las tablas se llamen como quisiera porque el factor
"etiqueta"
que debería indicar el primer nombre de la variable no es consdierado, como
podrán ver.
?Si correo el código para la variable, resulta algo
como:> tabla
Sexo N Porc PorcAc NEA NOA Nacionales Provinciales Municipales
Comunitarios Religiosos Privados
1 Mujer 270 86.8 86.8 92.7 84.2 77.8 89.6 83.8
78.9 90 100
2 Varon 40 12.9 99.7 7.3 15.3 22.2 10.4 16.2
19.3 10 NA
3 <NA> 1 0.3 100.0 NA 0.5 NA NA NA
NA NA NA?
?Pero como tengo que hacerlo muchas veces, necesitaría poder escribir esta
(mi primera) función. Ahorraría mucho tiempo, además ?de asegurarme que no
pifio en el copiar y pegar y reemplazar.
?Adjunto datos de prueba y una tabla con los las variables y sus
variable.labels (nombres).
?Se usa:
library(data.table)
library(tidyverse) # library(dplyr)
library(stringr)
Muchas gracias.
Saludos.
--
Mauricio
--
Mauricio
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL:
<https://stat.ethz.ch/pipermail/r-help-es/attachments/20170315/423ca50b/attachment-0001.html>
------------ próxima parte ------------
A non-text attachment was scrubbed...
Name: nombres.csv
Type: text/csv
Size: 97085 bytes
Desc: no disponible
URL:
<https://stat.ethz.ch/pipermail/r-help-es/attachments/20170315/423ca50b/attachment-0002.bin>
------------ próxima parte ------------
A non-text attachment was scrubbed...
Name: datos.csv
Type: text/csv
Size: 10831 bytes
Desc: no disponible
URL:
<https://stat.ethz.ch/pipermail/r-help-es/attachments/20170315/423ca50b/attachment-0003.bin>
Estimado Mauricio Monsalvo
R es un lenguaje medio complicado, no es orientado a objetos, aunque hay formas
para un trabajo con objetos, por otro lado se puede definir una función o
emplear 5 paquetes para lo mismo en dos líneas de código.
Usted tiene 1500 líneas de código, no es fácil de comprenderlas, tampoco hay
recetas mágicas.
Yo ordenaría como si fuesen cajas, una entrada, un proceso dentro de la caja,
una salida. Cada caja hace algo, de la forma que usted desea. Luego las apila
para llegar desde el piso al techo que desea. Si hay un cambio puede reemplazar
una caja por otra.
Ahora, posiblemente, aunque no es certero, pienso que usted puede crear esas
cajas por separado y no tiene problemas, pero al juntarlas en una función
aparecen los inconvenientes, una opción es utilizar ciclos for anidados (o el
bucle que desea) con condicionales para distintos casos si es necesario. Pienso
extrapolando algunas experiencias que tuve, pero desconozco si es aplicable a su
caso.
Yo prefiero por secciones de código pequeñas, porque también me paso que voy
probando, corriendo código que coloca cosas en la memoria, pero resulta que eso
que fue a la memoria es de un código obsoleto, y luego al día siguiente en la
nueva sesión de R no corre como se pensaba porque la memoria no es la misma y
encontrar el error es un rompedero de cabeza.
Lo que usted nombra en el resultado de la etiqueta sexo, si lo separa en bloques
solo se preocuparía en solucionar la forma de salida desde data.table, es mucho
más sencillo y cualquiera puede aportar algo a meterse dentro de una función
escrita por otro.
Javier Rubén Marcuzzi
De: Mauricio Monsalvo
Enviado: miércoles, 15 de marzo de 2017 8:59
Para: r-help-es
Asunto: [R-es] Fwd: Crear una función
Gracias, Javier.
Es una buena orientación. ¿Qué criterio utilizarías para aislar las funciones?
¿Cada una que crea un objeto es una función en sí misma, que luego puede ser
llamada por otra? Me parece más eficiente y seguro es más sencillo de mantener,
pero con poco práctica en funciones me pareció un camino a evitar...
Aprovecho y adjunto los archivos que en el anterior no lo había hecho y también
corrijo un error de transcripción.
En este momento, más allá del interés de aprender y mejorar la forma de encarar
estos problemas (tengo más de 1500 líneas de código que puedo resumir con esta
función), el principal problema que veo es que no logro que el objeto etiqueta,
que en la segunda línea asigna un factor al parámetro y sea luego el nombre que
aparece en las variables datos[, .N, by = .(etiqueta =
?x
)], porque el data.table "nombra" esa variable como etiqueta (literal)
en lugar de utilizar el factor ("Sexo", en el ejemplo) asignado
?a
etiqueta <- "Sexo".-
Espero se entienda...
---------- Mensaje reenviado ----------
De: Mauricio Monsalvo <m.monsalvo en gmail.com>
Fecha: 15 de marzo de 2017, 7:21
Asunto: Crear una función
Para: r-help-es <r-help-es en r-project.org>
Hola.
Estoy intentando crear una función pero no logro que termine de cerrar y mi
manejo no permite que el google me ayude...
n.reg.dep <- function(x, y) {
??
etiqueta <- str_replace(nombres[Variable == y, Descripcion], "[ ]",
"")
tabla <- datos[, .N, by = .(etiqueta =
?x
)] #
tabla <- tabla[, Porc := round(N/sum(N)*100,1)] # %
tabla[, PorcAc := cumsum(Porc)]
# Regiones
tabla.1 <- datos[, .N, by = .(etiqueta = x, Region)]
tabla.1[, Porc := round(N/sum(N)*100,1), by =.(Region)]
tabla.1 <- spread(tabla.1[, .(etiqueta, Region, Porc)], key =
Region, value = Porc)
tabla.reg <- left_join(tabla, tabla.1)
# Depdendencia
tabla.1 <- datos[, .N, by = .(etiqueta = x, Dependencia = B2a)]
tabla.1[, Porc := round(N/sum(N)*100,1), by =.(Dependencia)] # % por
Dependencia
tabla.1 <- na.omit(tabla.1)
tabla.1 <- spread(tabla.1[, .(etiqueta, Dependencia, Porc)], key =
Dependencia, value = Porc)
tabla.dep <- left_join(tabla, tabla.1)
tabla <- left_join(tabla.reg, tabla.dep)
return(tabla)
}
n.reg.dep(datos$A3a, "A3a")
n.reg.dep(datos$A3a)
?Si bien anda y el resultado es bastante parecido al que espero, no puedo hacer
que las tablas se llamen como quisiera porque el factor "etiqueta" que
debería indicar el primer nombre de la variable no es consdierado, como podrán
ver.
?Si correo el código para la variable, resulta algo
como:> tabla
Sexo N Porc PorcAc NEA NOA Nacionales Provinciales Municipales
Comunitarios Religiosos Privados
1 Mujer 270 86.8 86.8 92.7 84.2 77.8 89.6 83.8
78.9 90 100
2 Varon 40 12.9 99.7 7.3 15.3 22.2 10.4 16.2
19.3 10 NA
3 <NA> 1 0.3 100.0 NA 0.5 NA NA NA
NA NA NA?
?Pero como tengo que hacerlo muchas veces, necesitaría poder escribir esta (mi
primera) función. Ahorraría mucho tiempo, además ?de asegurarme que no pifio en
el copiar y pegar y reemplazar.
?Adjunto datos de prueba y una tabla con los las variables y sus variable.labels
(nombres).
?Se usa:
library(data.table)
library(tidyverse) # library(dplyr)
library(stringr)
Muchas gracias.
Saludos.
--
Mauricio
--
Mauricio
[[alternative HTML version deleted]]