根据列名称获取R中的列号

Joã*_*iel 59 r

可能重复:
从数据框中的标签获取列索引

我需要获取给定名称的列的列号.

我们有以下数据框:

df <- data.frame(a=rnorm(100),b=rnorm(100),c=rnorm(100))
Run Code Online (Sandbox Code Playgroud)

我需要一个像下面这样工作的函数:

getColumnNumber(df,"b")
Run Code Online (Sandbox Code Playgroud)

它会回来

[1] 2
Run Code Online (Sandbox Code Playgroud)

有这样的功能吗?

谢谢!

Ari*_*man 107

which( colnames(df)=="b" )
Run Code Online (Sandbox Code Playgroud)

应该这样做.


Mat*_*wle 60

一个快速而简洁的方法是:

> match("b",names(df))
[1] 2
Run Code Online (Sandbox Code Playgroud)

这避免了矢量扫描是==which做的.如果你有很多专栏,并且你做了很多,那么你可能会喜欢fastmatch包.

> require(fastmatch)
> fmatch("b",names(df))
[1] 2
Run Code Online (Sandbox Code Playgroud)

fmatchmatch它更快,但在随后的调用中,它不仅更快,而且是即时的.

  • 如果我只使用一个变量(一列),"匹配"和"哪个"对我来说同样适用.但是,如果我使用多个变量,"哪个"会抛出错误,而"匹配"则不会给我错误.所以对于我的情况,"匹配"是一个很好的选择.谢谢! (2认同)

42-*_*42- 14

另一种更好地推广到非精确匹配任务的方法是使用grep:

grep("^b$", colnames(df) )
Run Code Online (Sandbox Code Playgroud)

如果您想要删除以"b"开头的所有列名的数量,您可以写:

df[ , - grep("^b", colnames(df) )]
Run Code Online (Sandbox Code Playgroud)

这整齐地解决了你不能使用带有字符向量的负索引的问题.


Kay*_*Kay 9

..特别是,如果您需要获得多个列索引,则以下方法适用:

> df <- data.frame(a=rnorm(100),b=rnorm(100),c=rnorm(100))
> which(names(df)%in%c("b", "c"))
[1] 2 3
Run Code Online (Sandbox Code Playgroud)

如果你用这个子集df你不需要哪个()

> df_sub <- df[, names(df)%in%c("b", "c")]
> head(df_sub)
           b          c
1  0.1712754  0.3119079
2 -1.3656995  0.7111664
3 -0.2176488  0.7714348
4 -0.6599826 -0.3528118
5  0.4510227 -1.6438053
6  0.2451216  2.5305453
Run Code Online (Sandbox Code Playgroud)