Come ottenere una riga da R data.frame


103

Ho un data.frame con intestazioni di colonna.

Come posso ottenere una riga specifica da data.frame come elenco (con le intestazioni di colonna come chiavi per l'elenco)?

Nello specifico, il mio data.frame è

      ABC
    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

E voglio ottenere una riga che sia l'equivalente di

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

Risposte:


128
x[r,]

dove r è la riga che ti interessa. Prova questo, ad esempio:

#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

Questa pagina (da questo utile sito ) contiene buone informazioni sull'indicizzazione come questa.


14

L'indicizzazione logica è molto R-ish. Provare:

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

O:

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

7

Provare:

> 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

5

Se non conosci il numero di riga, ma conosci alcuni valori, puoi utilizzare il sottoinsieme

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)

intendi questo invece? sottoinsieme (x, A == 5 && B == 4.25 && C == 4.5)
momeara

No, avrebbe dovuto essere:subset(x, A ==5 & B==4.25 & C==4.5)
IRTFM

1

10 anni dopo ---> Usando tidyverse potremmo ottenere questo risultato semplicemente e prendendo in prestito un foglio da Christopher Bottoms . Per una migliore comprensione, vedi 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

Creato il 06/08/2020 dal pacchetto reprex (v0.3.0)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.