[R-es] Division entre el numero de ocurrencias parciales y totalesdentro de un DataFrame de manera eficiente

Carlos Ortega cof en qualityexcellence.es
Vie Mayo 13 11:15:39 CEST 2016


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]]



Más información sobre la lista de distribución R-help-es