【问题标题】:Get the column number in R given the column name [duplicate]在给定列名的情况下获取R中的列号[重复]
【发布时间】:2012-02-14 13:05:49
【问题描述】:

可能重复:
Get column index from label in a data frame

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

假设我们有以下数据框:

df <- data.frame(a=rnorm(100),b=rnorm(100),c=rnorm(100))

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

getColumnNumber(df,"b")

它会返回

[1] 2

有这样的功能吗?

谢谢!

【问题讨论】:

    标签: r


    【解决方案1】:
    which( colnames(df)=="b" )
    

    应该这样做。

    【讨论】:

      【解决方案2】:

      一种快速简洁的方法是:

      > match("b",names(df))
      [1] 2
      

      这避免了==which 所做的矢量扫描。如果您有很多列,并且经常这样做,那么您可能会喜欢fastmatch package

      > require(fastmatch)
      > fmatch("b",names(df))
      [1] 2
      

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

      【讨论】:

      • 如果我只使用一个变量(一列),“匹配”和“哪个”对我来说同样有效。但是,如果我使用多个变量,“which”会引发错误,而“match”不会给我错误。所以对于我的情况,“匹配”是一个更好的选择。谢谢!
      【解决方案3】:

      另一种更好地推广到非精确匹配任务的方法是使用grep,它返回一个数字向量以匹配字符向量中的模式:

      grep("^b$", colnames(df) )
      

      如果您想按位置编号删除所有名称以“b”开头的列,您可以这样写:

      df[ , - grep("^b", colnames(df) )]
      

      这巧妙地解决了不能对字符向量使用负索引的问题。

      【讨论】:

        【解决方案4】:

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

        > 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
        

        【讨论】:

          猜你喜欢
          • 2011-06-16
          • 2018-08-20
          • 2013-12-21
          • 1970-01-01
          • 2018-07-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多