2011-07-25 24 views
9

Tengo un marco de datos en el que quiero utilizar ciertos valores como claves hash/claves del diccionario (o como se llame en el idioma de su elección) para otros valores en ese marco de datos. Decir que tengo una trama de datos como éste, que he leído desde un archivo csv grande (sólo primera fila se muestra):¿Cómo uso los elementos de un marco de datos como claves hash/claves del diccionario/claves principales?

Plate.name QN.number Well Allele.X.Rn Allele.Y.Rn Call 
1 Plate 1_A1 QN2200 A  1.766  2.791 Both 

en el que R código sería:

structure(list(Plate.name = structure(1L, .Label = "Plate 1_A1", class = "factor"), 
    QN.number = structure(1L, .Label = "QN2200", class = "factor"), 
    Well = structure(1L, .Label = "A1", class = "factor"), Allele.X.Rn = 1.766, 
    Allele.Y.Rn = 2.791, Call = structure(1L, .Label = "Both", class = "factor")), .Names = c("Plate.name", 
"QN.number", "Well", "Allele.X.Rn", "Allele.Y.Rn", "Call"), class = "data.frame", row.names = c(NA, 
-1L)) 

THe QN.numbers son identificaciones únicas en mi conjunto de datos. ¿Cómo puedo recuperar datos usando QN.number como referencia para los otros valores, es decir, quiero saber la llamada o Allele.X.Rn para un QN.number dado? Parece row.names podría hacer el truco, pero ¿cómo los usaría en esta instancia?

+0

1 para un reproducibles ejemplo y pregunta bien hecha. –

+0

Los nombres de fila en un marco de datos deben ser únicos (como en un hash o diccionario), por lo que es posible que desee hacer esa comprobación antes de usar QN.number en row.names(). Algo como 'sum (tapply (d $ a, d $ a, length)> 1)' le dirá cuántos duplicados hay en la columna a del marco de datos d. – Seth

+0

Ah sí, gracias. Seth, debería haber mencionado que QN.number es una identificación única. Editaré la pregunta – arandomlypickedname

Respuesta

5

Uso row.names es así:

> row.names(d)=d$QN.number 
> d["QN2200",] 
     Plate.name QN.number Well Allele.X.Rn Allele.Y.Rn Call 
QN2200 Plate 1_A1 QN2200 A1  1.766  2.791 Both 
> d["QN2201",] 
    Plate.name QN.number Well Allele.X.Rn Allele.Y.Rn Call 
NA  <NA>  <NA> <NA>   NA   NA <NA> 

que acaba de utilizar el nombre de la fila como el primer parámetro en la creación de subconjuntos. También puede utilizar varios nombres de las filas:

> d=data.frame(a=letters[1:10],b=runif(10)) 
> row.names(d)=d$a 
> d[c("a","g","d"),] 
    a   b 
a a 0.6434431 
g g 0.6724661 
d d 0.9826392 

Ahora no estoy seguro de lo inteligente que es, y si lo hace la búsqueda secuencial para cada nombre de la fila o la indexación más rápido ...

+0

Gracias por su ayuda – arandomlypickedname

0

Suponiendo que estamos almacenando nuestra trama de datos en un nombre de variable - voy llaman dataframe por ahora - lo siguiente debería hacerlo:

dataframe$Allele.X.Rn[which(dataframe$Qn.number == <whatever>)]

Cuando, por supuesto, es <whatever> el número que le gustaría usar para Qn.number.

+1

No necesita la llamada a 'which'; la indexación lógica está bien. –

+0

Huh ... así es. ¡Gracias por señalar eso! –

+2

Otra opción sería: 'dataframe [dataframe $ QN.number ==" QN2200 "," Allele.Y.Rn "]'. –

4

Use subset.

subset(your_data, QN.number == "QN2200", Allele.X.Rn) 

with proporciona una alternativa; aquí la salida es un vector en lugar de otro marco de datos.

with(your_data, Allele.X.Rn[QN.number == "QN2200"]) 
+0

Puedo hacer que un subconjunto trabaje en el conjunto de datos de prueba limitado que he proporcionado, pero no puedo obtenerlo mientras mi vida trabaje en el conjunto de datos real: el temido error "columnas indefinidas seleccionadas" – arandomlypickedname

Cuestiones relacionadas