Es exactamente lo que necesitaba! Muchas gracias!
2016-05-13 11:32 GMT+02:00 Carlos Ortega <[email protected]>: > Hola, > > Con data.table, para que ya no tengas problema de escalado... > > #-------- > library(data.table) > DT <- as.data.table(df) > DT[, ab := paste(DT$a, DT$b, sep ="_")] > DT[, fr_a := .N, by='a'] > DT[, fr_ab := .N, by='ab'] > DT[, res := (DT$fr_ab / DT$fr_a)] > DT[ ,c("ab", "fr_a", "fr_ab") := NULL] > #-------- > > > head(DT) > a b c res > 1: a x 1 0.3333333 > 2: b y 1 0.2857143 > 3: c z 0 0.3333333 > 4: b w 0 0.4285714 > 5: c x 1 0.3333333 > 6: a y 1 0.3333333 > > Saludos, > Carlos Ortega > www.qualityexcellence.es > > El 13 de mayo de 2016, 11:15, Carlos Ortega <[email protected]> > escribió: > >> Hola, >> >> Esta es otra alternativa, que si tu data.frame es grande puede verse >> perjudicada tanto por el uso de "table" como por el de "merge". >> >> #----------------------- >> >> a <- c(rep(c('a','b','c','b','c'),3),'b') >> b <- c(rep(c('x','y','z','w'),4)) >> c <- c(rep(c(1,1,0,0),4)) >> df <- data.frame(a,b,c,stringsAsFactors = FALSE) >> >> df$ab <- paste(df$a, df$b, sep="_") >> >> tab_ab <- as.data.frame(table(df$ab)) >> tab_a <- as.data.frame(table(df$a)) >> >> df_a <- merge(df, tab_a, by.x=1, by.y=1); names(df_a)[5] <- 'fr_a' >> df_end <- merge(df_a, tab_ab, by.x=4, by.y=1); names(df_end)[6] <- 'fr_ab' >> >> df_end$res <- (df_end$fr_ab / df_end$fr_a) >> df_end <- df_end[, c(2,3,4,7)] >> head(df_end) >> #----------------------- >> >> Que produce el resultado que querías... >> > head(df_end) >> a b c res >> 1 a x 1 0.3333333 >> 2 a y 1 0.3333333 >> 3 a z 0 0.3333333 >> 4 b w 0 0.4285714 >> >> >> >> Saludos, >> Carlos Ortega. >> www.qualityexcellence.es >> >> El 13 de mayo de 2016, 10:54, Toni Massó Jou <[email protected]> >> escribió: >> >>> Hola: >>> >>> Aplicaré lo que dices de usar data.table. >>> >>> Sobre hacer for, etc. Ya lo he hecho, pero pensaba que usar dplyr haría >>> la >>> tarea más rápida por estar este implementado en C (si no me equivoco). >>> Siempre que puedo utilizo estas funciones, porque codificas menos y van >>> más >>> rápido. En este caso el problema es que no he encontrado la manera de >>> hacer >>> lo que quiero con dplyr o similar. La idea era al final comparar >>> rendimientos... >>> >>> >>> Muchas gracias Javier! ;) >>> >>> 2016-05-12 23:59 GMT+02:00 Javier Marcuzzi < >>> [email protected]> >>> : >>> >>> > Estimado Tomi Massó Jou >>> > >>> > >>> > >>> > Pienso en dos partes, la primera, para ser optimizado debería trabajar >>> con >>> > vectores. En todo caso con for, if. >>> > >>> > >>> > >>> > Lo segundo que pienso, usted dice que va a tener muchos datos, ¿Qué >>> pasa >>> > si en lugar de data.frame intenta con data.table? >>> > >>> > >>> > >>> > Javier Rubén Marcuzzi >>> > >>> > >>> > >>> > *De: *Toni Massó Jou <[email protected]> >>> > *Enviado: *jueves, 12 de mayo de 2016 18:50 >>> > *Para: *[email protected] >>> > *Asunto: *[R-es] Division entre el numero de ocurrencias parciales y >>> > totalesdentro de un DataFrame de manera eficiente >>> > >>> > >>> > >>> > Hola: >>> > >>> > >>> > >>> > A ver si me podéis ayudar que estoy atascado... >>> > >>> > >>> > >>> > Necesito contar los subcasos de la columna 2 de un dataframe respecto >>> a los >>> > >>> > casos de la columna 1. >>> > >>> > >>> > >>> > Es decir, tengo un data.frame >>> > >>> > >>> > >>> > a<-c(rep(c('a','b','c','b','c'),3),'b') >>> > >>> > b<-c(rep(c('x','y','z','w'),4)) >>> > >>> > c<-c(rep(c(1,1,0,0),4)) >>> > >>> > df1<-data.frame(a,b,c,stringsAsFactors = FALSE) >>> > >>> > >>> > >>> > >>> > >>> > Y necesito contar los casos donde aparece "a" y "x" y dividirlo por el >>> > >>> > total de filas con primera columna=a. , >>> > >>> > >>> > >>> > >>> > >>> > >>> > >>> > df1: >>> > >>> > > df1 >>> > >>> > a b >>> > >>> > 1 a x >>> > >>> > 2 b y >>> > >>> > 3 c z >>> > >>> > 4 b w >>> > >>> > 5 c x >>> > >>> > 6 a y >>> > >>> > 7 b z >>> > >>> > 8 c w >>> > >>> > 9 b x >>> > >>> > 10 c y >>> > >>> > 11 a z >>> > >>> > 12 b w >>> > >>> > 13 c x >>> > >>> > 14 b y >>> > >>> > 15 c z >>> > >>> > 16 b w >>> > >>> > >>> > >>> > Si hago >>> > >>> > df2<-df1%>%group_by(a)%>%count(a,b,c) >>> > >>> > df3<-df1%>%group_by(a)%>%count(a) >>> > >>> > >>> > >>> > en el df2: >>> > >>> > a b n >>> > >>> > (chr) (chr) (int) >>> > >>> > 1 a x 1 >>> > >>> > 2 a y 1 >>> > >>> > 3 a z 1 >>> > >>> > 4 b w 3 >>> > >>> > 5 b x 1 >>> > >>> > 6 b y 2 >>> > >>> > 7 b z 1 >>> > >>> > 8 c w 1 >>> > >>> > 9 c x 2 >>> > >>> > 10 c y 1 >>> > >>> > 11 c z 2 >>> > >>> > >>> > >>> > Necesito transformarlo en: >>> > >>> > >>> > >>> > a b n >>> > >>> > (chr) (chr) (int) >>> > >>> > 1 a x 1/3 >>> > >>> > 2 a y 1/3 >>> > >>> > 3 a z 1/3 >>> > >>> > 4 b w 3/7 >>> > >>> > 5 b x 1/7 >>> > >>> > 6 b y 2/7 >>> > >>> > 7 b z 1/7 >>> > >>> > 8 c w 1/6 >>> > >>> > 9 c x 2/6 >>> > >>> > 10 c y 1/6 >>> > >>> > 11 c z 2/6 >>> > >>> > >>> > >>> > >>> > >>> > donde 1/3 es el número de filas con valor (a,x)/totalvalores a. >>> > >>> > >>> > >>> > En fin, no se si me explico. >>> > >>> > >>> > >>> > El problema que tengo es que voy a tener muchisimas filas con pocas >>> > >>> > repeticiones, y no consigo hacer algo minimamente eficiente (y ya no >>> > >>> > digamos elegante). >>> > >>> > >>> > >>> > Muchas gracias por vuestro tiempo! >>> > >>> > >>> > >>> > Att. Toni >>> > >>> > >>> > >>> > [[alternative HTML version deleted]] >>> > >>> > >>> > >>> > _______________________________________________ >>> > >>> > R-help-es mailing list >>> > >>> > [email protected] >>> > >>> > https://stat.ethz.ch/mailman/listinfo/r-help-es >>> > >>> > >>> > >>> >>> [[alternative HTML version deleted]] >>> >>> _______________________________________________ >>> R-help-es mailing list >>> [email protected] >>> https://stat.ethz.ch/mailman/listinfo/r-help-es >>> >> >> >> >> -- >> Saludos, >> Carlos Ortega >> www.qualityexcellence.es >> > > > > -- > Saludos, > Carlos Ortega > www.qualityexcellence.es > [[alternative HTML version deleted]] _______________________________________________ R-help-es mailing list [email protected] https://stat.ethz.ch/mailman/listinfo/r-help-es
