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?
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)
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")]
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
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
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.
Wobei df1 Ihr ursprünglicher Datenrahmen ist:
df2 <- subset(df1, select = c(1, 2, 5))
Nur aus irgendeinem Grund
df[, (names(df) %in% c("A","B","E"))]
arbeitete für mich. Alle obigen Syntaxen ergaben "ausgewählte undefinierte Spalten".
Sie können with
verwenden:
with(df, data.frame(A, B, E))
[
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"))
)