2011-05-10 24 views
5

¿Cómo puedo seleccionar todas las filas para una muestra aleatoria de valores de columna?R - ¿Seleccionar filas para una muestra aleatoria de valores de columna?

Tengo una trama de datos que tiene este aspecto:

tag weight 

R007  10 
R007  11 
R007  9 
J102  11 
J102  9 
J102  13 
J102  10 
M942  3 
M054  9 
M054  12 
V671  12 
V671  13 
V671  9 
V671  12 
Z990  10 
Z990  11 

Eso puede replicar usando ...

weights_df <- structure(list(tag = structure(c(4L, 4L, 4L, 1L, 1L, 1L, 1L, 
3L, 2L, 2L, 5L, 5L, 5L, 5L, 6L, 6L), .Label = c("J102", "M054", 
"M942", "R007", "V671", "Z990"), class = "factor"), value = c(10L, 
11L, 9L, 11L, 9L, 13L, 10L, 3L, 9L, 12L, 12L, 14L, 5L, 12L, 11L, 
15L)), .Names = c("tag", "value"), class = "data.frame", row.names = c(NA, 
-16L)) 

Necesito crear una trama de datos que contiene todas las filas de lo anterior dataframe para dos etiquetas muestreadas al azar. Digamos etiquetas R007and M942 ser seleccionado al azar, mi nueva trama de datos tiene que tener este aspecto:

tag weight 

R007  10 
R007  11 
R007  9 
M942  3 

¿Cómo se hace esto?

sé que puedo crear una lista de dos etiquetas al azar como esto:

library(plyr) 
tags <- ddply(weights_df, .(tag), summarise, count = length(tag)) 
set.seed(5464) 
tag_sample <- tags[sample(nrow(tags),2),] 
tag_sample 

Resultando en ...

tag count 
4 R007  3 
3 M942  1 

Pero simplemente no saben cómo utilizar que al subconjunto mi dataframe original

Respuesta

7

es esto lo que quieres?

subset(weights_df, tag%in%sample(levels(tag),2)) 
+0

Lo tienes :) ¡Gracias! De hecho, traté de encontrar un operador "in" similar a SQL, pero no se me ocurrió nada. –

+0

nice one. aunque no creo que necesites invocar la función 'levels'. – Ramnath

+0

@Ramnath aquí 'levels' es necesario. – kohske

2

Si su hoja.de.datos se llama dfrm, entonces esto va a seleccionar al azar 100 tag s

dfrm[ sample(NROW(dfrm), 100), "tag" ] # possibly with repeats 

Si, por el contrario, desea una trama de datos con las mismas columnas (posiblemente con repeticiones):

samp <- dfrm[ sample(NROW(dfrm), 100), ] # leave the col name entry blank to get all 

Una tercera posibilidad ... quieres 100 etiquetas diferentes al azar, pero no con la probabilidad ponderada en absoluto a la frecuencia:

samp.tags <- unique(dfrm$tag)[ sample(length(unique(dfrm$tag)), 100] 

Editar: Con la pregunta revisada; uno de estos:

subset(dfrm, tag %in% c("R007", "M942")) 

O:

dfrm[dfrm$tag %in% c("R007", "M942"), ] 

O:

dfrm[grep("R007|M942", dfrm$tag), ] 
+0

Lo siento, no estoy seguro de que mi pregunta original fuera muy clara, así que no creo que tu respuesta se aplique a lo que estaba tratando de hacer. ¿La pregunta actualizada tiene más sentido? –

+0

Habría sido trivial utilizar cualquier subconjunto o "[" con '% en%' –

Cuestiones relacionadas