【问题标题】:Return a list containing the index of multiple column names [duplicate]返回一个包含多个列名索引的列表[重复]
【发布时间】:2017-06-03 11:44:03
【问题描述】:

假设我有以下数据框:

df <- data.frame(A = c(1, 2, 3), B = c("a", "b", "c"), C = c(4, 5, 6))

  A B C
1 1 a 4
2 2 b 5
3 3 c 6

如果我想知道列的位置,例如B列,那么我可以使用:

which(names(df)=="B")

或者

grep("B", names(df))

在这两种情况下,我都会得到2,但是如果我想同时知道A 列和C 列的位置怎么办?也就是说,我想输入一个列名向量,并得到一个它们位置的向量。所以,如果我输入"A", "C",结果应该是1 3

当输入列名向量而不是单个向量时,我使用的上述两个示例似乎不起作用。

我知道我可以使用循环来做到这一点,但是有没有一种方法可以实现更好的性能?

【问题讨论】:

    标签: r dataframe


    【解决方案1】:

    不需要*apply/循环。你需要match。请参阅?match 的文档。例如:

    match(c("A","C"),names(df))
    #[1] 1 3
    

    其他*apply/loops 解决方案的性能要差得多。

    【讨论】:

    • 接受,谢谢!关于欺骗,我不认为“在数据框中查找列名列表的位置”与“在向量中查找元素的 位置,奖励:查找多个”相同- 只是因为他们最终使用了相同的功能。特别是因为这个问题还涉及match和循环之间的性能比较方面
    • 完全一样:另一个问题的v 向量在这里用names(df) 表示(顺便说一下,一个向量)。您想在另一个向量中找到元素的位置;第二个向量由 data.frame 的列名表示这一事实完全无关紧要。
    • 我很不同意,但不会打扰它。另外,FWIW,我在看,你的答案早于 @DavidArenburg 的(现已删除)评论,其中包含相同的答案,所以你不必担心 :)
    【解决方案2】:

    sapply() 视为内部for 循环;它遍历列名列表,然后应用grep/which

    sapply(vector.of.columns, function(x) which(names(df) == x))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-12-15
      • 2017-10-04
      • 2012-10-10
      • 1970-01-01
      • 1970-01-01
      • 2016-10-29
      • 1970-01-01
      相关资源
      最近更新 更多