Abrufen des Spaltenindex von der Beschriftung in einem Datenrahmen


78

Angenommen, wir haben den folgenden Datenrahmen:

> df
  A B C
1 1 2 3
2 4 5 6
3 7 8 9

Wir können die Spalte 'B' aus ihrem Index auswählen:

> df[,2]
[1] 2 5 8

Gibt es eine Möglichkeit, den Index (2) von der Spaltenbezeichnung ('B') zu erhalten?


2
Siehe @ matthewdowles Antwort hier für die beste Lösung: stackoverflow.com/a/9277935/636656
Ari B. Friedman

Antworten:


109

Sie können den Index erhalten über grepund colnames:

grep("B", colnames(df))
[1] 2

oder verwenden

grep("^B$", colnames(df))
[1] 2

um nur die Spalten mit dem Namen "B" ohne diejenigen zu erhalten, die ein B enthalten, z. B. "ABC".


1
Die Vorteile Ihres ursprünglichen Beispiels könnten im Code demonstriert werden, wenn Sie seine Verwendung in etwas wie df [, grep ("^ B", Spaltennamen (df))] zeigen, dh die Datenrahmenspalten zurückgeben, die mit "B" beginnen. Sie können es gerne in einer weiteren Bearbeitung verwenden, wenn Sie damit einverstanden sind.
IRTFM

2
Oder sogar df [, grep ("^ [BC]", Spaltennamen (df))], dh die Spalten, die entweder mit B oder C beginnen.
IRTFM

@Dwin: Wie @aix bereits sagte, möchte der Fragesteller den Index . Aber ich benutze normalerweise auch grepdie Art und Weise, wie Sie es beschreiben.
Henrik

@ Henrik. Ich danke dir sehr. Dies muss der nützlichste Befehl sein, um mit dplyr und Variablen zu arbeiten!
user989762

85

Folgendes wird es tun:

which(colnames(df)=="B")

2
Das Problem mit grepist auch der Vorteil, dass es reguläre Ausdrücke verwendet (so dass Sie nach jedem Muster in Ihren Spaltennamen suchen können). Um nur die Spaltennamen "B" zu erhalten, verwenden Sie "^B$"als Muster in grep. ^ ist das Metazeichen für den Anfang und $ für das Ende eines Strings.
Henrik

9
Du brauchst nicht einmal which. Sie können direkt verwendendf[names(df)=="B"]
nico

4
@nico Die Frage ist, den Index der Spalte zu erhalten.
NPE

"Welches" hat bei mir in jedem Fall funktioniert. Ich konnte mit grep keine Spalte mit dem Namen "fBodyAcc-meanFreq () - Z" abrufen.
Panos Kal.

1
@ Kabamaru: Grep funktioniert, solange Sie den Metazeichen entkommen. Für das Beispiel, das Sie gegeben haben, funktioniert dies: grep("^fBodyAcc-meanFreq\\()-Z$",colnames(df))oder auch grep("^fBodyAcc-meanFreq\\(\\)-Z$",colnames(df)).
Steve

7

Ich wollte alle Indizes für die Spaltennamen anzeigen, da ich eine komplizierte Spaltenumordnung vornehmen musste, also habe ich die Spaltennamen als Datenrahmen gedruckt. Die Rownamen sind die Indizes.

as.data.frame(colnames(df))

1 A
2 B
3 C

1
Ein prägnanterer Weg, dies zu tun, ist cbind(names(df)).
Lilemets

6

Nach der obigen Antwort von chimeric :

Um ALLE Spaltenindizes in der df zu erhalten , habe ich Folgendes verwendet:

which(!names(df)%in%c()) 

oder in einer Liste speichern:

indexLst<-which(!names(df)%in%c())

1
Ich denke, dies ist die beste Antwort, weil es verallgemeinert werden kann
Dimitrios Zacharatos

2

Dies scheint eine effiziente Möglichkeit zu sein, Variablen mit der Spaltennummer aufzulisten:

cbind(names(df)) 

Ausgabe:

     [,1]
[1,] "A" 
[2,] "B" 
[3,] "C" 

Manchmal kopiere ich gerne Variablen mit Position in meinen Code, damit ich diese Funktion verwende:

varnums<- function(x) {w=as.data.frame(c(1:length(colnames(x))),
          paste0('# ',colnames(x)))
names(w)= c("# Var/Pos")
w}
varnums(df)

Ausgabe:

# Var/Pos
# A         1
# B         2
# C         3

1
match("B", names(df))

Kann auch funktionieren, wenn Sie einen Namensvektor haben.


0

Verwendung tFunktion:

t(colnames(df))

     [,1]   [,2]   [,3]   [,4]   [,5]   [,6]  
[1,] "var1" "var2" "var3" "var4" "var5" "var6"
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.