2010-12-13 10 views
52

że mamy następującą ramkę danych:Zdobądź indeks kolumny z etykietą w ramce danych

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

Możemy wybrać kolumny „B” od indeksie:

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

Czy istnieje sposób, aby uzyskać indeks (2) z etykiety kolumny ("B")?

+2

Patrz odpowiedź @ matthewdowle jest tutaj najlepszym rozwiązaniem: http://stackoverflow.com/a/9277935/636656 –

Odpowiedz

73

można uzyskać poprzez indeks grep i colnames:

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

lub użyj

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

aby tylko uzyskać kolumny o nazwie "B", bez tych, którzy zawierają np B "ABC".

+1

zalety oryginalnego przykład mógłby zostać wykazane w kodzie, jeśli pokazał jej zastosowanie w czymś takim df [, grep ("^ B", colnames (df))], tzn. zwracanie kolumn danych zaczynających się od "B". Jeśli wyrażasz na to zgodę, możesz skorzystać z dalszej edycji. –

+2

Albo nawet df [, grep ("^ [BC]", colnames (df))], tj. Kolumny zaczynające się od B lub C. –

+0

@Dwin: As @Aix już powiedział, pytający chce indeksu * *. Ale zwykle używam 'grep' tak, jak to opisujesz. – Henrik

66

Następujące będzie to zrobić:

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

Problem z 'grep' jest również zaletą, a mianowicie, że używa wyrażeń regularnych (aby można było wyszukać dowolny wzorzec w twoich nazwach). Aby uzyskać nazwy colnames "B" użyj '"^B $ "' jako wzorca w grep.^jest metaznakiem dla początku i $ dla końca łańcucha. – Henrik

+6

Nie potrzebujesz nawet "które". Możesz bezpośrednio użyć 'df [names (df) ==" B "]' – nico

+3

@nico Pytanie brzmi, aby uzyskać * indeks * kolumny. – NPE

5

Chciałem zobaczyć wszystkie indeksy dla colnames bo muszę zrobić skomplikowaną column rearrangement, więc wydrukowaliśmy colnames jak dataframe. Rownames są wskaźnikami.

as.data.frame(colnames(df)) 

1 A 
2 B 
3 C 
+0

Bardziej zwięzłym sposobem na to jest 'cbind (names (df))'. – lillemets

Powiązane problemy