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

Toni Massó Jou tmassojou en gmail.com
Vie Mayo 13 11:37:08 CEST 2016


Es exactamente lo que necesitaba!

Muchas gracias!

2016-05-13 11:32 GMT+02:00 Carlos Ortega <cof en qualityexcellence.es>:

> 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