2012-04-10 24 views
250

Ich habe einen R-Datenrahmen mit 6 Spalten, und ich möchte einen neuen Datenrahmen, der nur drei der Spalten hat erstellen.Extrahieren bestimmter Spalten aus einem Datenrahmen

Unter der Annahme, mein Datenrahmen df ist, und ich möchte Spalten extrahieren A, B und E, ist dies der einzige Befehl, den ich herausfinden kann:

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

Gibt es eine kompaktere Art und Weise, dies zu tun ?

Antwort

342

Ja, gibt es.

# 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")] 
+2

Das gibt den Fehler 'Objekt vom Typ' Schließung 'ist nicht Teilmenge'. –

+19

@ArenCambre: dann wird Ihr data.frame nicht wirklich 'df' genannt. 'df' ist auch eine Funktion im Statistikpaket. –

+4

@ArenCambre: http://2.bp.blogspot.com/-XU9PduVhq-I/Um-Y6e19jZI/AAAAAAAADfI/PrmoFQexa5M/s1600/Buch+last+page.jpg –

42

Es gibt zwei offensichtliche Möglichkeiten: Joshua Ulrich 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 
70

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 
+0

Wenn ich dies mit meinen Daten versuche, bekomme ich den Fehler: "Fehler in x [j]: ungültiger tiefgestellter Typ 'list'" Aber wenn c ("A", "B") keine Liste ist , Was ist es? –

+0

@Rafael_Espericueta Schwer zu erraten, ohne den Code zu sehen ... Aber 'c (" A "," B ")' ist ein Vektor, keine Liste. –

+0

Es konvertiert Datenrahmen zu Liste. –

28

Verwendung die dplyr Paket, wenn Ihr data.frame wird df1 genannt:

library(dplyr) 

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

Dies kann auch als ohne die %>% Rohr geschrieben werden:

select(df1, A, B, E) 
6

Wieder dplyr verwenden, wo df1 ursprünglichen Datenrahmen:

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

Dies verwendet nicht 'dplyr'. Es verwendet 'base :: subset' und ist identisch mit [Stephane Laurents Antwort] (https://stackoverflow.com/a/10086494/903061), außer dass Sie Spaltennummern anstelle von Spaltennamen verwenden. – Gregor

0

[ und Teilmenge nicht substituierbar sind:

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")) 
) 
+0

Nicht, wenn Sie 'drop = FALSE' setzen. Beispiel: 'df [, c (" a "), drop = F]' – untill

6

Sie können auch das sqldf Paket verwenden, die als wählen auf R-Datenrahmen durchführt:

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

Dies gibt als Ausgang einen Datenrahmen df1 mit Säulen: A, B, E.

2

Aus irgendeinem Grund nur

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

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

Verwandte Themen