So erhalten Sie eine Zeile aus R data.frame

103

Ich habe einen data.frame mit Spaltenüberschriften.

Wie kann ich eine bestimmte Zeile aus dem data.frame als Liste abrufen (mit den Spaltenüberschriften als Schlüssel für die Liste)?

Insbesondere ist mein 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

Und ich möchte eine Zeile bekommen, die dem entspricht

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

Antworten:

128
x[r,]

Dabei ist r die Zeile, an der Sie interessiert sind. Versuchen Sie dies zum Beispiel:

#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

Diese Seite (von dieser nützlichen Site ) enthält gute Informationen zur Indizierung wie diese.

Matt Parker
quelle
14

Die logische Indizierung ist sehr R-ish. Versuchen:

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

Oder:

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

Versuchen:

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

Wenn Sie die Zeilennummer nicht kennen, aber einige Werte kennen, können Sie eine Teilmenge verwenden

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
quelle
meinst du das stattdessen Teilmenge (x, A == 5 && B == 4,25 && C == 4,5)
Momeara
Nein, es hätte sein sollen:subset(x, A ==5 & B==4.25 & C==4.5)
IRTFM
1

10 Jahre später ---> Mit tidyverse konnten wir dies einfach erreichen und ein Blatt von Christopher Bottoms ausleihen . Zum besseren Verständnis siehe 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

Erstellt am 06.08.2018 durch das reprex-Paket (v0.3.0)

odunayo12
quelle