Adesso o taglio dataframe dalla lista di gamma di classe e riassumere con ddply
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?
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.