Bagaimana mendapatkan baris dari R data.frame

103

Saya memiliki data.frame dengan header kolom.

Bagaimana saya bisa mendapatkan baris tertentu dari data.frame sebagai daftar (dengan tajuk kolom sebagai kunci untuk daftar)?

Secara khusus, data.frame saya adalah

      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

Dan saya ingin mendapatkan baris yang setara dengan

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

Jawaban:

128
x[r,]

dengan r adalah baris yang Anda minati. Coba ini, misalnya:

#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

Halaman ini (dari situs bermanfaat ini ) memiliki informasi yang baik tentang pengindeksan seperti ini.

Matt Parker
sumber
14

Pengindeksan logis sangat R-ish. Mencoba:

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

Atau:

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

Mencoba:

> 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
sumber
5

Jika Anda tidak mengetahui nomor barisnya, tetapi mengetahui beberapa nilai, maka Anda dapat menggunakan subset

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
sumber
apakah yang Anda maksud ini sebagai gantinya? subset (x, A == 5 && B == 4.25 && C == 4.5)
momeara
Tidak, seharusnya:subset(x, A ==5 & B==4.25 & C==4.5)
IRTFM
1

10 tahun kemudian ---> Menggunakan tidyverse kita dapat mencapai ini dengan mudah dan meminjam daun dari Christopher Bottoms . Untuk pemahaman yang lebih baik, lihat 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

Dibuat pada 2020-08-06 oleh paket reprex (v0.3.0)

odunayo12
sumber