web-dev-qa-db-de.com

Extrahieren bestimmter Spalten aus einem Datenrahmen

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

Angenommen, mein Datenrahmen ist df, und ich möchte Spalten A, B und E extrahieren. Dies ist der einzige Befehl, den ich herausfinden kann:

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

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

338
Aren Cambre

Verwenden Sie das Paket dplyr , wenn Ihr data.frame df1 heißt:

library(dplyr)

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

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

select(df1, A, B, E)
118
Sam Firke

Sie können eine Teilmenge mit einem Vektor von Spaltennamen erstellen. Ich bevorzuge diesen Ansatz gegenüber jenen, die Spaltennamen wie Objektnamen behandeln (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")]
428
Joshua Ulrich

Dies ist die Rolle der Funktion subset() :

> 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
95

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
70
Henry

Sie können auch das sqldf -Paket verwenden, das die Auswahl von R-Datenrahmen wie folgt ausführt:

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

Dies ergibt als Ausgabe einen Datenrahmen df1 mit den Spalten: A, B, E.

13
Aman Burman

Wobei df1 Ihr ursprünglicher Datenrahmen ist:

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

Nur aus irgendeinem Grund

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

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

10
so860

Sie können with verwenden:

with(df, data.frame(A, B, E))
1

[ und Teilmenge sind nicht austauschbar:

[ 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
fxi