Toni Massó Jou
2016-May-13 08:54 UTC
[R-es] Division entre el numero de ocurrencias parciales y totalesdentro de un DataFrame de manera eficiente
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 <javier.ruben.marcuzzi en gmail.com> :> 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 <tmassojou en gmail.com> > *Enviado: *jueves, 12 de mayo de 2016 18:50 > *Para: *r-help-es en r-project.org > *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 > > R-help-es en r-project.org > > https://stat.ethz.ch/mailman/listinfo/r-help-es > > >[[alternative HTML version deleted]]
Carlos Ortega
2016-May-13 09:15 UTC
[R-es] Division entre el numero de ocurrencias parciales y totalesdentro de un DataFrame de manera eficiente
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 <tmassojou en gmail.com> 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 < > javier.ruben.marcuzzi en gmail.com> > : > > > 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 <tmassojou en gmail.com> > > *Enviado: *jueves, 12 de mayo de 2016 18:50 > > *Para: *r-help-es en r-project.org > > *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 > > > > R-help-es en r-project.org > > > > https://stat.ethz.ch/mailman/listinfo/r-help-es > > > > > > > > [[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 >-- Saludos, Carlos Ortega www.qualityexcellence.es [[alternative HTML version deleted]]
Carlos Ortega
2016-May-13 09:32 UTC
[R-es] Division entre el numero de ocurrencias parciales y totalesdentro de un DataFrame de manera eficiente
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 <cof en qualityexcellence.es> 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 <tmassojou en gmail.com> > 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 < >> javier.ruben.marcuzzi en gmail.com> >> : >> >> > 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 <tmassojou en gmail.com> >> > *Enviado: *jueves, 12 de mayo de 2016 18:50 >> > *Para: *r-help-es en r-project.org >> > *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 >> > >> > R-help-es en r-project.org >> > >> > https://stat.ethz.ch/mailman/listinfo/r-help-es >> > >> > >> > >> >> [[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 >> > > > > -- > Saludos, > Carlos Ortega > www.qualityexcellence.es >-- Saludos, Carlos Ortega www.qualityexcellence.es [[alternative HTML version deleted]]