从数据框中的标签获取列索引


78

假设我们有以下数据框:

> 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的答案以获得最佳解决方案:stackoverflow.com/a/9277935/636656
Ari B. Friedman

Answers:


109

您可以通过grep和获取索引colnames

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

或使用

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

只获得名为“ B”的列,而没有包含B的列,例如“ ABC”。


1
如果您在df [,grep(“ ^ B”,colnames(df))]之类显示其用法,即返回以“ B”开头的数据框列,则可以在代码中证明原始示例的优势。如果您同意,可以随时在进一步的编辑中使用。
IRTFM 2010年

2
或甚至DF [,grep的( “^ [BC]”,colnames(DF))],即与B或C.启动列
IRTFM

@Dwin:正如@a​​ix已经说过的,请求者想要索引。但是我通常也会用grep您描述的方式。
亨里克(Henrik)2010年

@亨里克 非常感谢。这必须是与dplyr和变量一起使用的最有用的单个命令!
user989762 '02

85

将执行以下操作:

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

2
问题grep的另一个好处是,它使用正则表达式(因此您可以在您的姓氏中搜索任何模式)。要仅获取名称“ B” "^B$",请在grep中用作模式。^是字符串开头的元字符,$是字符串结尾的元字符。
亨里克(Henrik)2010年

8
您甚至都不需要which。您可以直接使用df[names(df)=="B"]
nico 2010年

4
@nico问题是获取列的索引
NPE 2010年

在任何情况下,“哪个”都为我工作。我无法使用grep获得名称为“ fBodyAcc-meanFreq()-Z”的列。
Panos Kal。

1
@Kabamaru:只要您转义元字符,Grep就可以工作。对于您给出的示例,这将起作用:grep("^fBodyAcc-meanFreq\\()-Z$",colnames(df))或也grep("^fBodyAcc-meanFreq\\(\\)-Z$",colnames(df))
史蒂夫

7

我想查看这些姓氏的所有索引,因为我需要进行复杂的列重排,因此我将这些姓氏打印为数据框。行名是索引。

as.data.frame(colnames(df))

1 A
2 B
3 C

1
一种更简洁的方法是cbind(names(df))
lillemets

6

从上面的嵌合答案开始:

为了获得df中的所有列索引,所以我使用了:

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

或存储在列表中:

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

1
我认为这是最好的答案,因为它可以概括
迪米特里奥斯Zacharatos

2

这似乎是列出具有列号的var的有效方法:

cbind(names(df)) 

输出:

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

有时我喜欢将带有位置的变量复制到我的代码中,所以我使用以下函数:

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

输出:

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


0

使用t功能:

t(colnames(df))

     [,1]   [,2]   [,3]   [,4]   [,5]   [,6]  
[1,] "var1" "var2" "var3" "var4" "var5" "var6"
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.