Ho un frame di dati contenente 10k righe, per una data colonna X ho valori duplicati, Come possiamo selezionare casualmente SOLO UNA RIGA contenente questo valore in questa colonna?Seleziona casualmente su Data Frame, per righe univoche
risposta
La tua domanda non è del tutto chiara, ma suppongo che tu voglia sottocampionare l'intero frame di dati, mantenendo una riga (scelta casualmente) per "classe duplicata". Qualcosa di simile
library(plyr)
subsampled_data <- ddply(mydata,.(X),
function(x) {
x[sample(nrow(x),size=1),]
})
dovrebbe funzionare (non testati!)
Il mio primo istinto sarebbe stato qualcosa di simile soluzione elegante di Ben ddply
. Tuttavia, sapendo che hai un set di dati così ampio, ci sono sicuramente modi più veloci. Ecco uno che sarà molto più veloce se si hanno molti valori univoci:
RemoveDups <- function(df, column) {
inds = sample(1:nrow(df))
df = df[inds, ]
dups = duplicated(df[, column])
df = df[!dups, ]
inds = inds[!dups]
df[sort(inds, index=T)$ix, ]
}
simulare alcuni dati (qui con molti valori unici):
n.row = 10^6
n.col = 3
set.seed(12345)
data = data.frame(matrix(sample(1000, n.row*n.col, replace=T), nrow=n.row))
Confronta i 2 metodi:
> system.time(ddply(data, 'X1', function(x) x[sample(nrow(x), size=1), ]))
user system elapsed
3.264 0.921 4.315
> system.time(RemoveDups(data, 'X1'))
user system elapsed
0.375 0.025 0.399
Elegante! Fantastico, grazie Giovanni – Rad
- 1. Unisci righe nel data frame
- 2. Righe univoche in bash
- 3. Estrai tutte le righe univoche
- 4. Rimuovi righe ID non univoche
- 5. Seleziona coppie univoche in join automatico
- 6. T-Sql Query - Ottieni righe univoche su 2 colonne
- 7. Come contare le righe univoche in Oracle
- 8. Seleziona data tra due colonne
- 9. MySQL seleziona le righe in cui la data non è compresa tra la data
- 10. split data frame basato sull'indice intero
- 11. Java Swing JTable seleziona programmaticamente più righe
- 12. Seleziona tutte le righe con valore colonna distinta utilizzando LINQ
- 13. Seleziona righe distinte da MongoDB
- 14. Seleziona le righe appena inserite
- 15. Come per riordinare le righe indicizzati sulla base di un elenco di Pandas data frame
- 16. MySQL seleziona data/ora come stringa di data
- 17. Rimodellare un frame di dati --- cambiando righe per colonne
- 18. Seleziona le righe dei frame dei panda in base ai valori di due colonne
- 19. disable index pandas data frame
- 20. Unlist un frame di dati per righe, non per colonne
- 21. Seleziona query mysql tra data?
- 22. Linq - Seleziona data da DateTime
- 23. Formato data in SELEZIONA * query
- 24. Inserimento di sole righe univoche in SQLite (python)
- 25. Aggregare casualmente?
- 26. Seleziona righe distinte da datatable in Linq
- 27. seleziona le righe interessate da un aggiornamento
- 28. Funzionamento su frame dati
- 29. MySQL che seleziona valori distinti ordine per data/ora
- 30. Seleziona righe senza valori mancanti in R
Questa interpretazione della domanda (criptica) dell'OP sembra più probabile della mia, per cui avrei suggerito 'df [esempio (che (df $ X == mioVal), 1),]'. – joran
Grazie ragazzi, sto provando il suggerimento di Ben, Joran, come fare se voglio applicare questo valore a tutti i valori delle colonne perché myVal come suggerito nei tuoi frammenti cambia lungo la mia colonna X, il che significa che ho centinaia di 5 per esempio e centinaia di 8s ecc ecc – Rad
@ La soluzione di Ben Ben lo gestirà; il mio no. Abbiamo interpretato la tua domanda in modo diverso. – joran