2010-12-13 143 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