2012-04-25 9 views
5

Tengo un enorme conjunto de datos con información genotípica de diferentes poblaciones. Me gustaría ordenar los datos por población, pero no sé cómo.Subconjunto de datos/extracción de datos basados ​​en las primeras 7 letras

Me gustaría ordenar por "pedigree_dhl". Estaba usando el siguiente código, pero seguí recibiendo mensajes de error.

newdata <- project[pedigree_dhl == CCB133$*1, ] 

Mi problema es también que 'pedigrí-DHL' contiene todos los nombres de los genotipos individuales. Solo las primeras 7 letras en la columna 'pedigree-dhl' son el nombre de la población. En este ejemplo: CCB133. ¿Cómo puedo decirle a R que quiero extraer los datos de todas las columnas que contienen CCB133?

Allele1 Allele2  SNP_name gs_entry pedigree_dhl 
1  T  T ZM011407_0151  656 CCB133$*1 
2  T  T ZM009374_0354  656 CCB133$*1 
3  C  C ZM003499_0591  656 CCB133$*1 
4  A  A ZM003898_0594  656 CCB133$*1 
5  C  C ZM004887_0313  656 CCB133$*1 
6  G  G ZM000583_1096  656 CCB133$*1 
+2

'substr' le permite extraer subcadenas de un vector de caracteres. Deberá asegurarse de que su columna sea de hecho un vector de caracteres y no un factor antes de usar 'substr' o puede obtener algunos resultados inesperados. Para subconjuntos, busque SO para el subconjunto 'R 'y encontrará muchas respuestas. La función 'subconjunto()' en sí es bastante útil para la sesión interactiva, mientras que el uso del operador '[' es preferido en ciertas situaciones. – Chase

Respuesta

5

Es posible que desee considerar grep como en la respuesta en Using regexp to select rows in R dataframe. Adaptado a sus datos:

df <- read.table(text=" Allele1 Allele2  SNP_name gs_entry pedigree_dhl 
1  T  T ZM011407_0151  656 CCB133$*1 
2  T  T ZM009374_0354  656 CCB133$*1 
3  C  C ZM003499_0591  656 CCB133$*1 
4  A  A ZM003898_0594  656 CCB133$*1 
5  C  C ZM004887_0313  656 CCB133$*1 
6  G  G ZM000583_1096  656 CCB133$*1", header=T) 

# put into df1 all rows where pedigree_dhl starts with CCB133$ 
p1 <- 'CCB133$' 
df1 <- subset(df, grepl(p1, pedigree_dhl)) 

Pero su pregunta implica que es posible que desee para seleccionar el nombre de siete letras, o simplemente para ordenar las filas por nombre de pedigrí y puede ser más fácil de mantener todas las filas juntos en un clasificado marco de datos. Todas estas tres operaciones: subconjunto, extracción de una nueva columna o clasificación, pueden llevarse a cabo de forma independiente.

# If you want to create a new column based 
# on the first seven letter of SNP_name (or any other variable) 

df$SNP_7 <- substr(df$SNP_name, start=1, stop=7) 

# If you want to order by pedigree_dhl 
# then you don't need to select out the rows into a new dataframe 

df <- df[ with(df, order(df$pedigree_dhl)), ] 

Todo esto puede ser obvio: los agrego simplemente por completitud.

+0

'read.table' a partir de 2.14, creo que ahora toma el argumento de texto directamente, lo que significa que no es necesario' textConnection' –

+0

Gracias @Tyler Rinker; los viejos hábitos tardan en morir. Sin embargo, lo intenté sin éxito. También busqué en la 'ayuda' y veo que el parámetro 'archivo' puede ser una ruta a un archivo local, una conexión de texto o una URL. Feliz de ver alternativas, sin embargo, en una edición, ya que me encantaría una forma más elegante de hacer esto. – gauden

+1

He agregado la edición por usted. –

Cuestiones relacionadas