Buenos días: Después de más de 20 años en SAS, ahora igual me toca trabajar en R. Y la transición es muy dura: la "lógica" de los dos lenguajes es, para mi, totalmente diferente. Disculpen si lo que pregunto es una obviedad, pero llevo todo el día con esto y no logro encontrar la respuesta adecuada con google. Estoy intentado crear una función que realice una descriptiva simple de cualquier data frame. Simplificando es (en la función real definitiva la descriptiva es más completa): *************************** # Data.frame para pruebas: TBL <- data.frame(SE=sample(c("H","M"),10,TRUE), ED=(rnorm(10)+2.5)*20) # Función DES: DES = function(XDADES) { attach(XDADES) for (XVARNUM in XDADES) { if(is.numeric(XVARNUM)) { print (c("Var Num: ", mean(XVARNUM))) } else if(is.factor(XVARNUM)) { print (c("Var factor: ")) XOUT <- as.data.frame(table(XVARNUM)) print(XOUT <- transform(XOUT, cumFreq = cumsum(Freq), relative = prop.table(Freq))) } else { print ("Var desc") } } detach(XDADES) } DES(XDADES=TBL) *************************** Tengo dos problemas: 1. En: print (c("Var Num: ", mean(XVARNUM))) no consigo que imprima el nombre de la variable ED después de "Var Num:". En Internet parece que algunos sugieren utilizar: deparse(substitute(name(XVARNUM)))) pero no me funciona. 2. El resultando de mostrar las frecuencias de la variable SE es: [1] "Var factor: " XVARNUM Freq cumFreq relative 1 H 5 5 0.5 2 M 5 10 0.5 Como podría substituir XVARNUM por el nombre de la variable analizada (SE)? Muchas gracias por la atención y la ayuda y saludos.
Tengo dos problemas: 1. En: print (c("Var Num: ", mean(XVARNUM))) no consigo que imprima el nombre de la variable ED después de "Var Num:". En Internet parece que algunos sugieren utilizar: deparse(substitute(name(XVARNUM)))) pero no me funciona. Utiliza cat:> x=rnorm(100) > cat("Media",mean(x),"\n")Media -0.1058831 2. El resultando de mostrar las frecuencias de la variable SE es: [1] "Var factor: " XVARNUM Freq cumFreq relative 1 H 5 5 0.5 2 M 5 10 0.5 Como podría substituir XVARNUM por el nombre de la variable analizada (SE)?> XVARNUM=rpois(100, 5) > XOUT <- as.data.frame(table(XVARNUM)) > XOUT <- transform(XOUT, cumFreq = cumsum(Freq), relative = prop.table(Freq)) > names(XOUT)[1]="SE" > print(XOUT)SE Freq cumFreq relative 1 0 1 1 0.01 2 1 1 2 0.01 3 2 12 14 0.12 4 3 11 25 0.11 5 4 14 39 0.14 6 5 21 60 0.21 7 6 9 69 0.09 8 7 16 85 0.16 9 8 6 91 0.06 10 9 3 94 0.03 11 10 3 97 0.03 12 11 1 98 0.01 13 12 1 99 0.01 14 13 1 100 0.01>Un saludo. Olivier _______________________________________________ R-help-es mailing list R-help-es en r-project.org https://stat.ethz.ch/mailman/listinfo/r-help-es
Bueno, te contesté rápido sin analizar mucho qué duda tenías con la gramática de R. He modificado tu función: DES = function(XDADES) { with(XDADES, for (XVARNUM in names(XDADES)) { if(is.numeric(get(XVARNUM))) { cat("Var Num: ",XVARNUM,mean(get(XVARNUM)),"\n") } else if(is.factor(get(XVARNUM))) { cat("Var factor: ",XVARNUM,"\n") XOUT <- as.data.frame(table(get(XVARNUM))) XOUT <- transform(XOUT, cumFreq = cumsum(Freq), relative = prop.table(Freq)) print(XOUT) } else { cat ("Var desc") } } ) } Ahora da:> DES(XDADES=TBL)Var factor: SE Var1 Freq cumFreq relative 1 H 7 7 0.7 2 M 3 10 0.3 Var Num: ED 50.04875 Un saludo. Olivier
Un opción más elegante: DES = function(x) { res=NA if(is.numeric(x)) res=mean(x) else if(is.factor(x)) { res <- as.data.frame(table(x)) res <- transform(res, cumFreq = cumsum(Freq), relative = prop.table(Freq)) } return(res) }> lapply(TBL,DES)$SE x Freq cumFreq relative 1 H 8 8 0.8 2 M 2 10 0.2 $ED [1] 56.3203 Un saludo. Olivier