[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:32:01 CEST 2016


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



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