2010-12-13 42 views
52

假設我們有以下的數據幀:獲取列索引在數據幀

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

我們可以從它的索引選擇列「B」:

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

有沒有一種辦法從列標籤('B')獲取索引(2)?

+2

見@ matthewdowle的回答這裏最好的解決辦法:http://stackoverflow.com/a/9277935/636656 – 2014-07-14 16:20:39

回答

73

您可以通過grepcolnames獲得指數:

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

或使用

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

只獲取列被稱爲 「B」 沒有那些誰裝上B例如「ABC」。

+1

你原來的例子的優勢,可以在代碼中,如果你表現出其類似DF [使用證明, grep(「^ B」,colnames(df))],即返回以「B」開頭的數據幀列。如果您同意,請隨時使用進一步的編輯。 – 2010-12-13 14:56:45

+2

甚至df [,grep(「^ [BC]」,colnames(df))],即以B或C開頭的列。 – 2010-12-13 15:03:33

+0

@Dwin:@aix已經表示,提問者希望* index *。但我通常也會按照您描述的方式使用'grep'。 – Henrik 2010-12-13 16:05:43

66

下面將做到這一點:

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

'grep'的問題也是優點,即它使用正則表達式(因此您可以搜索您的姓名中的任何模式)。要獲取colnames「B」,使用'「^ B $」'作爲grep中的模式。 ^是開頭的元字符,$是字符串的結尾。 – Henrik 2010-12-13 09:44:07

+6

你甚至不需要'哪個'。你可以直接使用'df [names(df)==「B」]' – nico 2010-12-13 09:56:58

+3

@nico問題是獲取列的*索引*。 – NPE 2010-12-13 10:33:12

5

我想看到所有的指數爲colnames,因爲我需要做一個複雜的column rearrangement,所以我打印的colnames的數據幀。 rownames是指數。

as.data.frame(colnames(df)) 

1 A 
2 B 
3 C 
+0

更簡潔的方法是'cbind(names(df))'。 – lillemets 2018-02-12 11:35:52