446 Stimmen

Extrahieren bestimmter Spalten aus einem Datenrahmen

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

Angenommen, mein Datenrahmen ist df und ich möchte Spalten extrahieren A , B y E 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?

5 Stimmen

select(df, c('A','B','C'))

520voto

Joshua Ulrich Punkte 167720

Sie können eine Untermenge mit Hilfe eines Vektors von Spaltennamen bilden. Ich bevorzuge diesen Ansatz gegenüber solchen, die Spaltennamen wie Objektnamen behandeln (z.B. subset() ), insbesondere bei der Programmierung 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")]

Beachten Sie, dass es kein Komma gibt (d. h. es ist nicht df[,c("A","B","C")] ). Der Grund dafür ist df[,"A"] gibt einen Vektor zurück, keinen Datenrahmen. Aber df["A"] wird immer einen Datenrahmen zurückgeben.

str(df["A"])
## 'data.frame':    1 obs. of  1 variable:
## $ A: int 1
str(df[,"A"])  # vector
##  int 1

Merci à David Dorchies dass Sie darauf hingewiesen haben, dass df[,"A"] gibt einen Vektor statt eines Datenrahmens zurück, und zu Antoine Fabri für den Vorschlag einer besseren Alternative (oben) zu meiner ursprünglichen Lösung (unten).

# subset (original solution--not recommended)
df[,c("A","B","E")]  # returns a data.frame
df[,"A"]             # returns a vector

4 Stimmen

Dies führt zu dem Fehler object of type 'closure' is not subsettable .

24 Stimmen

@ArenCambre: dann ist Ihr data.frame nicht wirklich benannt df . df ist ebenfalls eine Funktion des Pakets stats.

5 Stimmen

251voto

Sam Firke Punkte 19101

を使用しています。 dplyr Paket, wenn Ihr data.frame den Namen df1 :

library(dplyr)

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

Dies kann auch ohne die %>% Rohr als:

select(df1, A, B, E)

5 Stimmen

In Anbetracht der beträchtlichen Entwicklung des Tidyverse seit der Veröffentlichung meiner Frage habe ich die Antwort an Sie weitergegeben.

6 Stimmen

In Anbetracht der rasanten Veränderungen im Tidyversum würde ich vor der Verwendung dieses Musters warnen. Dies ist zusätzlich zu meiner starken Präferenz gegen die Behandlung von Spaltennamen, als ob sie Objektnamen sind, wenn Sie Code für Funktionen, Pakete oder Anwendungen schreiben.

3 Stimmen

Es ist über vier Jahre her, dass diese Antwort eingereicht wurde, und das Muster hat sich nicht geändert. Gepipte Ausdrücke können recht intuitiv sein, weshalb sie auch so attraktiv sind.

115voto

Stéphane Laurent Punkte 57882

Dies ist die Aufgabe 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 Stimmen

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

0 Stimmen

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

0 Stimmen

Es konvertiert Datenrahmen in Listen.

90voto

Henry Punkte 6623

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

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

21voto

Richard Ball Punkte 530

Dabei ist df1 Ihr ursprünglicher Datenrahmen:

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

8 Stimmen

Dies verwendet keine dplyr . Es verwendet base::subset und ist identisch mit Antwort von Stephane Laurent mit dem Unterschied, dass Sie Spaltennummern anstelle von Spaltennamen verwenden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X