Extrahieren bestimmter Spalten aus einem Datenrahmen


365

Ich habe einen R-Datenrahmen mit 6 Spalten und möchte einen neuen Datenrahmen erstellen, der nur drei der Spalten enthält.

Unter der Annahme , meinen Datenrahmen ist df, und ich mag Extrakt Spalten A, Bund Edies ist die einzige Befehl kann ich herausfinden:

 data.frame(df$A,df$B,df$E)

Gibt es eine kompaktere Möglichkeit, dies zu tun?

Antworten:


156

Verwenden Sie das Paket dplyr , wenn Ihr data.frame aufgerufen wird df1:

library(dplyr)

df1 %>%
  select(A, B, E)

Dies kann auch ohne %>%Pipe geschrieben werden als:

select(df1, A, B, E)

2
Angesichts der beträchtlichen Entwicklung der Tidyverse seit dem Posten meiner Frage habe ich die Antwort auf Sie umgestellt.
Aren Cambre

4
Angesichts der rasanten Änderungsrate in der Tidyverse würde ich davor warnen, dieses Muster zu verwenden. Dies ist zusätzlich zu meiner starken Präferenz, Spaltennamen beim Schreiben von Code für Funktionen, Pakete oder Anwendungen so zu behandeln, als wären sie Objektnamen.
Joshua Ulrich

1
Es ist über vier Jahre her, seit diese Antwort eingereicht wurde, und das Muster hat sich nicht geändert. Piped-Ausdrücke können sehr intuitiv sein, weshalb sie ansprechend sind.
Aren Cambre

Wie führe ich einen weiteren Befehl für diese Teilmenge aus? Beispiel: Ich möchte das rowMean berechnen: "df1%>% rowMeans (select (A, B, E))" funktioniert nicht.
Ben

Sie würden eine Pipeline wie folgt verketten : df1 %>% select(A, B, E) %>% rowMeans(.). Lesen Sie die Dokumentation für die %>%Pipe, indem Sie?magrittr::`%>%`
Sam Firke

448

Sie können eine Teilmenge mithilfe eines Vektors von Spaltennamen erstellen. Ich bevorzuge diesen Ansatz gegenüber solchen, die Spaltennamen so behandeln, als wären sie Objektnamen (z. B. subset()), insbesondere beim Programmieren in Funktionen, Paketen oder Anwendungen.

# data for reproducible example
# (and to avoid confusion from trying to subset `stats::df`)
df <- setNames(data.frame(as.list(1:5)), LETTERS[1:5])
# subset
df[,c("A","B","E")]

4
Das gibt den Fehler object of type 'closure' is not subsettable.
Aren Cambre

24
@ArenCambre: dann ist dein data.frame nicht wirklich benannt df. dfist auch eine Funktion im Statistikpaket.
Joshua Ulrich


2
@Cina: Weil -"A"ein Syntaxfehler vorliegt. Und ?Extractsagt : „ , auch negative ganze Zahlen sein können, Elemente / Scheiben angibt , von der Auswahl auslassen.“ ij...
Joshua Ulrich

7
Es gibt ein Problem mit dieser Syntax, da, wenn wir nur eine Spalte R extrahieren, ein Vektor anstelle eines Datenrahmens zurückgegeben wird und dies unerwünscht sein könnte : > df[,c("A")] [1] 1. Die Verwendung subsethat diesen Nachteil nicht.
David Dorchies

100

Dies ist die Rolle der subset()Funktion:

> dat <- data.frame(A=c(1,2),B=c(3,4),C=c(5,6),D=c(7,7),E=c(8,8),F=c(9,9)) 
> subset(dat, select=c("A", "B"))
  A B
1 1 3
2 2 4

Wenn ich dies mit meinen Daten versuche, erhalte ich die Fehlermeldung: "Fehler in x [j]: ungültiger tiefgestellter Typ 'Liste'" Aber wenn c ("A", "B") keine Liste ist, was ist das? ?
Rafael_Espericueta

@Rafael_Espericueta Schwer zu erraten, ohne Ihren Code anzuzeigen ... Aber es c("A", "B")ist ein Vektor, keine Liste.
Stéphane Laurent

Es konvertiert Datenrahmen in Liste.
Suat Atan PhD

78

Es gibt zwei offensichtliche Möglichkeiten: Joshua Ulrichs df[,c("A","B","E")]oder

df[,c(1,2,5)]

wie in

> df <- data.frame(A=c(1,2),B=c(3,4),C=c(5,6),D=c(7,7),E=c(8,8),F=c(9,9)) 
> df
  A B C D E F
1 1 3 5 7 8 9
2 2 4 6 7 8 9
> df[,c(1,2,5)]
  A B E
1 1 3 8
2 2 4 8
> df[,c("A","B","E")]
  A B E
1 1 3 8
2 2 4 8

16

Nur aus irgendeinem Grund

df[, (names(df) %in% c("A","B","E"))]

arbeitete für mich. Alle obigen Syntaxen ergaben "undefinierte Spalten ausgewählt".


15

Wobei df1 Ihr ursprünglicher Datenrahmen ist:

df2 <- subset(df1, select = c(1, 2, 5))

7
Dies wird nicht verwendet dplyr. Es verwendet base::subsetund ist identisch mit der Antwort von Stephane Laurent, außer dass Sie Spaltennummern anstelle von Spaltennamen verwenden.
Gregor Thomas

14

Sie können das sqldfPaket, das Auswahlen für R-Datenrahmen ausführt, auch wie folgt verwenden:

df1 <- sqldf("select A, B, E from df")

Dies gibt als Ausgabe einen Datenrahmen df1mit Spalten: A, B, E.



1
df<- dplyr::select ( df,A,B,C)

Sie können den neu erstellten Daten auch einen anderen Namen zuweisen

data<- dplyr::select ( df,A,B,C)

0

[ und Teilmenge sind nicht ersetzbar:

[ Gibt einen Vektor zurück, wenn nur eine Spalte ausgewählt ist.

df = data.frame(a="a",b="b")    

identical(
  df[,c("a")], 
  subset(df,select="a")
) 

identical(
  df[,c("a","b")],  
  subset(df,select=c("a","b"))
)

4
Nicht wenn du einstellst drop=FALSE. Beispiel:df[,c("a"),drop=F]
bis zum
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.