【发布时间】:2012-02-14 13:05:49
【问题描述】:
我需要获取给定名称的列的列号。
假设我们有以下数据框:
df <- data.frame(a=rnorm(100),b=rnorm(100),c=rnorm(100))
我需要一个像下面这样工作的函数:
getColumnNumber(df,"b")
它会返回
[1] 2
有这样的功能吗?
谢谢!
【问题讨论】:
标签: r
我需要获取给定名称的列的列号。
假设我们有以下数据框:
df <- data.frame(a=rnorm(100),b=rnorm(100),c=rnorm(100))
我需要一个像下面这样工作的函数:
getColumnNumber(df,"b")
它会返回
[1] 2
有这样的功能吗?
谢谢!
【问题讨论】:
标签: r
which( colnames(df)=="b" )
应该这样做。
【讨论】:
一种快速简洁的方法是:
> match("b",names(df))
[1] 2
这避免了== 和which 所做的矢量扫描。如果您有很多列,并且经常这样做,那么您可能会喜欢fastmatch package。
> require(fastmatch)
> fmatch("b",names(df))
[1] 2
fmatch 比 match 快,但在随后的调用中,它不仅更快,而且是即时的。
【讨论】:
另一种更好地推广到非精确匹配任务的方法是使用grep,它返回一个数字向量以匹配字符向量中的模式:
grep("^b$", colnames(df) )
如果您想按位置编号删除所有名称以“b”开头的列,您可以这样写:
df[ , - grep("^b", colnames(df) )]
这巧妙地解决了不能对字符向量使用负索引的问题。
【讨论】:
..特别是,如果您需要获取多个列索引,则适用以下方法:
> df <- data.frame(a=rnorm(100),b=rnorm(100),c=rnorm(100))
> which(names(df)%in%c("b", "c"))
[1] 2 3
如果你用它来子集 df 你不需要 which()
> 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
【讨论】: