2012-04-04 14 views
6

Ho questo dataframeselezione di riga casuale in R

id <- c(1,1,1,2,2,3) 
name <- c("A","A","A","B","B","C") 
value <- c(7:12) 
df<- data.frame(id=id, name=name, value=value) 
df 

Questa funzione seleziona una riga casuale da esso:

randomRows = function(df,n){ 
    return(df[sample(nrow(df),n),]) 
} 

cioè

randomRows(df,1) 

Ma voglio selezionare casualmente una riga per 'nome' (o per 'id' che è lo stesso) e concatena l'intera riga in una nuova tabella, quindi in questo caso tre righe. Questo deve passare attraverso un dataframe di 2000+ righe. Per favore mostrami come ?!

risposta

2

Penso che si possa fare questo con il pacchetto plyr:

library("plyr") 
ddply(df,.(name),randomRows,1) 

che vi dà per esempio:

id name value 
1 1 A  8 
2 2 B 11 
3 3 C 12 

E 'questo quello che stai cercando?

+0

Buon uomo che fa esattamente quello che sto cercando! Funzione molto accurata. Grazie! – Bernard

+0

Prego. Potresti accettare la risposta in modo che gli altri sappiano che la domanda è stata esaudita? –

2

Ecco un modo di farlo in R. base di

> df.split <- split(df, df$name) 
> df.sample <- lapply(df.split, randomRows, 1) 
> df.final <- do.call("rbind", df.sample) 
> df.final 
    id name value 
A 1 A  7 
B 2 B 11 
C 3 C 12 
Problemi correlati