Domanda

Ho domande su ddply e sottoinsieme.

Ho dataframe df in questo modo:

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)      

PRIMA FASE:

Ho una lista di parità di intervallo con cut_interval in questo modo:

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

Così ho due livelli qui: [0,10) e (10,20]

SECONDA FASE:

Voglio ogni gruppo / classe è definire dai miei due livelli in v_cut ... in questo modo:

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)

FASE 3:

Voglio sapere la variabilità delle v_rank per asse x, e il tempo per l'asse y, per ogni v_cut gruppo, quindi ho bisogno di calcolare min, media, massimo, deviazione standard per il valore v_rank con qualcosa di simile

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

* risultato voluto: *

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]

Il mio problema

Non so come passare step 1 -> Fase 2: /

E se è possibile raggruppare da v_cut come il mio esempio al punto 3?

C'è una possibilità di fare le stesse cose con l'opzione "subset" di ddply?

Ancora una volta, grazie mille per il vostro aiuto grande guru R!

UPDATE 1:

ho una risposta per andare step1 a STEP2:

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

Sto usando plyr, ma ci sono forse una risposta migliore in questo caso?

Risposta per andare al punto 2 al punto 3?

UPDATE 2:

Brandon Bertelsen mi danno una buona risposta con colla + cast, ma ora (per capirci) voglio fare la stessa operazione con plyr e ddply .. con un risultato diverso:

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. 

sto cercando con qualcosa di simile:

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))')

Ma voglio avere nella mia v_cut dataframe sumData, come posso fare con ddply? c'è la possibilità di fare questa? O la fusione con df iniziale e = chiave v_idn aggiungere colonna v_cut al sumData è l'unica buona risposta?

È stato utile?

Soluzione

non si ha realmente bisogno plyr per questo, è possibile utilizzare 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))

se desideri solo la media, quindi sostituire l'ultima riga con:

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

tipo "DFX" e vedrete un frame di dati con quello che hai chiesto.

Altri suggerimenti

Stai solo avere un problema con la sintassi è tutto:

## 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
)))

In alternativa:

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

Con "(v_idn, v_time)" stai dicendo ddply che per ogni combinazione di v_idn e v_time, si vuole calcolare la media dei v_rank.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top