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 

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.


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 )

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

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)

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)

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.