Cómo obtener una fila de R data.frame

103

Tengo un data.frame con encabezados de columna.

¿Cómo puedo obtener una fila específica de data.frame como una lista (con los encabezados de columna como claves para la lista)?

Específicamente, mi data.frame es

      A B C
    1 5 4,25 4,5
    2 3,5 4 2,5
    3 3,25 4 4
    4 4,25 4,5 2,25
    5 1,5 4,5 3

Y quiero tener una fila que sea equivalente a

> c(a=5, b=4.25, c=4.5)
  a   b   c 
5.0 4.25 4.5 
Will Glass
fuente

Respuestas:

128
x[r,]

donde r es la fila que le interesa. Pruebe esto, por ejemplo:

#Add your data
x <- structure(list(A = c(5,    3.5, 3.25, 4.25,  1.5 ), 
                    B = c(4.25, 4,   4,    4.5,   4.5 ),
                    C = c(4.5,  2.5, 4,    2.25,  3   )
               ),
               .Names    = c("A", "B", "C"),
               class     = "data.frame",
               row.names = c(NA, -5L)
     )

#The vector your result should match
y<-c(A=5, B=4.25, C=4.5)

#Test that the items in the row match the vector you wanted
x[1,]==y

Esta página (de este sitio útil ) tiene buena información sobre indexación como esta.

Matt Parker
fuente
14

La indexación lógica es muy R-ish. Tratar:

 x[ x$A ==5 & x$B==4.25 & x$C==4.5 , ] 

O:

subset( x, A ==5 & B==4.25 & C==4.5 )
IRTFM
fuente
7

Tratar:

> d <- data.frame(a=1:3, b=4:6, c=7:9)

> d
  a b c
1 1 4 7
2 2 5 8
3 3 6 9

> d[1, ]
  a b c
1 1 4 7

> d[1, ]['a']
  a
1 1
ars
fuente
5

Si no conoce el número de fila, pero conoce algunos valores, puede usar subconjunto

x <- structure(list(A = c(5,    3.5, 3.25, 4.25,  1.5 ), 
                    B = c(4.25, 4,   4,    4.5,   4.5 ),
                    C = c(4.5,  2.5, 4,    2.25,  3   )
               ),
               .Names    = c("A", "B", "C"),
               class     = "data.frame",
               row.names = c(NA, -5L)
     )

subset(x, A ==5 & B==4.25 & C==4.5)
Thierry
fuente
¿te refieres a esto en su lugar? subconjunto (x, A == 5 && B == 4.25 && C == 4.5)
momeara
No, debería haber sido:subset(x, A ==5 & B==4.25 & C==4.5)
IRTFM
1

10 años después ---> Usando tidyverse pudimos lograr esto simplemente y tomando prestada una hoja de Christopher Bottoms . Para una mejor comprensión, consulte slice().

library(tidyverse)
x <- structure(list(A = c(5,    3.5, 3.25, 4.25,  1.5 ), 
                    B = c(4.25, 4,   4,    4.5,   4.5 ),
                    C = c(4.5,  2.5, 4,    2.25,  3   )
),
.Names    = c("A", "B", "C"),
class     = "data.frame",
row.names = c(NA, -5L)
)

x
#>      A    B    C
#> 1 5.00 4.25 4.50
#> 2 3.50 4.00 2.50
#> 3 3.25 4.00 4.00
#> 4 4.25 4.50 2.25
#> 5 1.50 4.50 3.00

y<-c(A=5, B=4.25, C=4.5)
y
#>    A    B    C 
#> 5.00 4.25 4.50

#The slice() verb allows one to subset data row-wise. 
x <- x %>% slice(1) #(n) for the nth row, or (i:n) for range i to n, (i:n()) for i to last row...

x
#>   A    B   C
#> 1 5 4.25 4.5

#Test that the items in the row match the vector you wanted
x[1,]==y
#>      A    B    C
#> 1 TRUE TRUE TRUE

Creado el 2020-08-06 por el paquete reprex (v0.3.0)

odunayo12
fuente