【问题标题】:Get column index from label in a data frame从数据框中的标签获取列索引
【发布时间】:2010-12-13 09:09:31
【问题描述】:

假设我们有以下数据框:

> 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)?

【问题讨论】:

标签: r


【解决方案1】:

您可以通过grepcolnames获取索引:

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

或使用

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

只获取名为“B”的列而不包含包含 B 的列,例如“ABC”。

【讨论】:

  • 如果您在 df[ , grep("^B", colnames(df)) ] 之类的东西中展示了原始示例的使用,则可以在代码中证明原始示例的优势,即返回以开头的数据框列“乙”。如果您同意,请随时在进一步的编辑中使用。
  • 甚至 df[ , grep("^[BC]", colnames(df)) ],即以 B 或 C 开头的列。
  • @Dwin:正如@a​​ix 已经说过的,提问者想要index。但我通常也使用grep 你描述的方式。
  • @Henrik。非常感谢。这必须是处理 dplyr 和变量的最有用的命令!
【解决方案2】:

下面会做:

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

【讨论】:

  • grep 的问题也是优点,即它使用正则表达式(因此您可以在您的 colnames 中搜索任何模式)。要获取 colnames "B",请使用 "^B$" 作为 grep 中的模式。 ^ 是字符串开头的元字符,$ 是字符串结尾的元字符。
  • 你甚至不需要which。可以直接使用df[names(df)=="B"]
  • @nico 问题是获取列的index
  • “哪个”在每种情况下都对我有用。我无法使用 grep 获得名为“fBodyAcc-meanFreq()-Z”的列。
  • @Kabamaru:只要您转义元字符,Grep 就会起作用。对于您提供的示例,这将起作用:grep("^fBodyAcc-meanFreq\\()-Z$",colnames(df))grep("^fBodyAcc-meanFreq\\(\\)-Z$",colnames(df))
【解决方案3】:

我想查看列名的所有索引,因为我需要做一个复杂的column rearrangement,所以我将列名打印为数据框。行名是索引。

as.data.frame(colnames(df))

1 A
2 B
3 C

【讨论】:

  • 更简洁的方法是cbind(names(df))
  • @lillemets 如果您的目标是简洁,t(t(names(df))) 可以为您节省 2 个字符 ;)
【解决方案4】:

从上面 chimeric 的答案继续:

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

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

或存储在列表中:

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

【讨论】:

  • 我认为这是最好的答案,因为它可以概括
【解决方案5】:

这似乎是一种用列号列出变量的有效方法:

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

【讨论】:

    【解决方案6】:
    match("B", names(df))
    

    如果您有名称向量,也可以使用。

    【讨论】:

      【解决方案7】:

      使用t函数:

      t(colnames(df))
      
           [,1]   [,2]   [,3]   [,4]   [,5]   [,6]  
      [1,] "var1" "var2" "var3" "var4" "var5" "var6"
      

      【讨论】:

        【解决方案8】:

        这是一个可以概括 Henrik 答案的答案。

        df=data.frame(A=rnorm(100), B=rnorm(100), C=rnorm(100))
        numeric_columns<-c('A', 'B', 'C')
        numeric_index<-sapply(1:length(numeric_columns), function(i)
        grep(numeric_columns[i], colnames(df))) 
        

        【讨论】:

        • sapplymatch(numeric_columns, names(df)) 的路很长——除非你真的需要正则表达式的能力而不是精确的字符串匹配。
        • 感谢@GregorThomas...不太熟悉比赛。在这种情况下,它要短一些,但我喜欢 sapply,因为它更明确地说明了正在发生的事情……我猜是他们自己的(没有对任何性能差异进行基准测试)
        【解决方案9】:

        稍微概括@NPE的答案:

        which(colnames(dat) %in% var)
        

        var 的形式是

        c("colname1","colname2",...,"colnamen") 
        

        返回需要的任何列名的索引。

        【讨论】:

          猜你喜欢
          • 2022-06-29
          • 1970-01-01
          • 2017-02-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-12
          • 2013-07-21
          • 2023-04-07
          相关资源
          最近更新 更多