Pregunta

Tengo pregunta sobre ddply y subgrupo.

Tengo trama de datos DF como esto:

df <- read.table(textConnection(
"   id v_idn v_seed v_time v_pop v_rank v_perco 
    1  15    125648 0      150   1      15      
    2  17    125648 0      120   2      5       
    3  18    125648 0      100   3      6       
    4  52    125648 0      25    4      1       

    5  17    125648 10     220   1      5      
    6  15    125648 10     160   2      15       
    7  18    125648 10     110   3      6      
    8  52    125648 10     50    4      1       

    9  56   -11152  0      250   1      17      
    10 15   -11152  0      180   2      15      
    11 18   -11152  0      110   3      6       
    12 22   -11152  0      5     4      14      

    13 56   -11152  10     250   1      17      
    14 15   -11152  10     180   2      15      
    15 22   -11152  10     125   3      14      
    16 18   -11152  10     120   4      6 "), header=TRUE)      

PASO:

Tengo una lista de intervalos iguales con cut_interval como esto:

myinterval <- cut_interval(c(15,5,6,1,17,14), length=10)  

Así que tengo dos niveles aquí: [0,10) y (10,20]

PASO DOS:

Quiero que cada grupo / clase se define por mis dos niveles en v_cut ... como esto:

id v_idn v_seed v_time v_pop v_rank v_perco v_cut
1  15    125648 0      150   1      15      (10,20]
2  17    125648 0      120   2      5       [0,10)
3  18    125648 0      100   3      6       [0,10)
4  52    125648 0      25    4      1       [0,10)

5  17    125648 10     220   1      5       [0,10)
6  15    125648 10     160   2      15      (10,20] 
7  18    125648 10     110   3      6       [0,10)
8  52    125648 10     50    4      1       [0,10)

9  56   -11152  0      250   1      17      (10,20]
10 15   -11152  0      180   2      15      (10,20]
11 18   -11152  0      110   3      6       [0,10)
12 22   -11152  0      5     4      14      (10,20]

13 56   -11152  10     250   1      17      (10,20]
14 15   -11152  10     180   2      15      (10,20]
15 22   -11152  10     125   3      14      (10,20]
16 18   -11152  10     120   4      6       [0,10)

PASO 3:

Quiero saber la variabilidad de v_rank de eje x, y el tiempo para el eje Y, para cada grupo v_cut, por eso es necesario para calcular min, media, máximo, sd para el valor v_rank con algo como

ddply(df, .(v_cut,v_time), summarize ,mean = mean(v_rank), min = min(v_rank), max = max(v_rank), sd = sd(v_rank))

* resultado deseado: *

id  v_time MEAN.v_rank ... v_cut
1   0      2.25            (10,20]
2   0      2.42            [0,10)
3   10     2.25            [0,10)
4   10     2.42            (10,20]

MI PROBLEMA

No sé cómo pasar el paso 1 -> Paso 2: /

Y si es posible agrupar por v_cut como mi ejemplo en el paso 3?

¿Existe la posibilidad de hacer lo mismo con la opción "subconjunto" de ddply?

Una vez más, muchas gracias por su ayuda gran gurú R!

ACTUALIZACIÓN 1:

Tengo una respuesta para ir paso 1 al paso 2:

df$v_cut <- cut_interval(df$v_perco,n=10)

Estoy usando plyr, pero hay tal vez una mejor respuesta en este caso?

Respuesta para ir al paso 2 al paso 3?

ACTUALIZACIÓN 2:

Brandon Bertelsen dame una buena respuesta con la fusión + fundido, pero ahora (entender) quiero hacer la misma operación con plyr y ddply .. con un resultado diferente:

id  v_idn v_time MEAN.v_rank ... v_cut
    1   15   0      2.25            (10,20]
    2   15   10     2.45            (10,20]
    2   17   0      1.52            [0,10)
    2   17   10     2.42            [0,10)
    etc. 

Estoy tratando con algo como esto:

r('sumData <- ddply(df, .(v_idn,v_time), summarize,min = min(v_rank),mean =  mean(v_rank), max = max(v_rank), sd=sd(v_rank))')

Pero quiero tener en mi v_cut trama de datos sumData, ¿cómo puedo hacer con ddply? ¿hay una opción para hacer esto? O fusionarse con df = clave inicial y v_idn añadir v_cut columna para sumData es la única buena respuesta?

¿Fue útil?

Solución

Usted no necesita realmente plyr de esto, se puede utilizar reshape

## Pull what you need
dfx <- df[c("v_seed", "v_time","v_rank","v_perco")]
## Bring in your cuts
dfx <- data.frame(dfx, ifelse(df$v_perco > 10,"(10,20]", "[0,10)")))
## Rename v_cut
colnames(dfx)[ncol(dfx)] <- "v_cut"       
## Melt it.    
dfx <- melt(dfx, id=c("v_cut", "v_seed", "v_time"))
## Cast it.
dfx <- cast(dfx, v_cut + v_time + v_seed ~ variable, c(mean,min,max,sd))

si solo deseas la media, luego vuelva a colocar la última línea con:

dfx <- cast(dfx, v_cut + v_time + v_seed ~ variable, mean)

tipo "DFX" y verá un cuadro de datos con lo que has pedido.

Otros consejos

No eres más que un problema con la sintaxis es todo:

## Add your cut
df.new <- data.frame(df, ifelse(df$v_perco > 10,"(10,20]", "[0,10)"))
## Rename v_cut
colnames(df.new)[ncol(df.new)] <- "v_cut"   

## Careful here read the note below
df.new <- ddply(df.new, .(v_idn, v_time), function(x) unique(data.frame(
mean =  mean(x$v_rank),
v_cut = x$v_cut
)))

Alternativamente:

ddply(df.new, .(v_idn, v_time), summarise, mean=mean(v_rank))

Con "(v_idn, v_time)" usted está diciendo ddply que para cada combinación de v_idn y v_time, usted quiere que calcular la media de v_rank.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top