2011-11-07 9 views

Respuesta

6

Su pregunta no está del todo clara, pero asumo que desea submuestrear todo el marco de datos, manteniendo una fila (elegida al azar) por "clase duplicada". Algo así como

library(plyr) 
subsampled_data <- ddply(mydata,.(X), 
    function(x) { 
      x[sample(nrow(x),size=1),] 
    }) 

deben trabajar (no probado!)

+1

Esta interpretación de la pregunta de OP (críptico) parece más probable que la mía, por lo que iba a sugerir 'df [muestra (que (df $ X == myVal), 1),]'. – joran

+1

Gracias chicos, estoy intentando la sugerencia de Ben, Joran, cómo hacerlo si quiero aplicar esto a todo el valor de columna porque myVal como se sugiere en los fragmentos cambia a lo largo de mi columna X, lo que significa que tengo cientos de 5 por ejemplo y cientos de 8s, etc. – Rad

+0

La solución de @Rad Ben se encargará de eso; el mío no lo hará. Interpretamos su pregunta de manera diferente. – joran

6

Mi primera reacción habría sido algo como solución elegante ddply de Ben. Sin embargo, sabiendo ahora que tienes un conjunto de datos tan grande, definitivamente hay formas más rápidas. Aquí está uno que será mucho más rápido si tiene muchos valores únicos:

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, ] 
} 

simular algunos datos (en este caso con muchos valores únicos):

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

comparar los 2 métodos:

> 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 
+0

Elegante! Impresionante, gracias John – Rad

Cuestiones relacionadas