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?

Aren Cambre
quelle

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)
Sam Firke
quelle
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")]
Joshua Ulrich
quelle
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
Stéphane Laurent
quelle
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
Henry
quelle
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".

so860
quelle
15

Wobei df1 Ihr ursprünglicher Datenrahmen ist:

df2 <- subset(df1, select = c(1, 2, 5))
Richard Ball
quelle
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.

Aman Burman
quelle
2

Sie können verwenden with:

with(df, data.frame(A, B, E))
Moody_Mudskipper
quelle
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)
Mohamed Rahouma
quelle
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"))
)
fxi
quelle
4
Nicht wenn du einstellst drop=FALSE. Beispiel:df[,c("a"),drop=F]
bis zum