2017-01-18 95 views
1

假設我有以下的數據幀:返回包含多個列名的索引列表

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

以上兩個我用過的例子在輸入列名向量而不是單個列名時似乎不起作用。

我知道我可以用循環做到這一點,但有沒有一種方法可以實現更好的性能?

回答

3

無需*apply /循環。你需要match。請參閱文檔?match。例如:

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

其他*apply /迴路解決方案的性能方面更糟糕。

+0

接受,謝謝!關於欺騙,我不認爲「在數據框中找到列名的列表的位置」與「查找向量中的元素的位置,獎金:找到多個」相同 - 只是因爲它們結束使用相同的功能。特別是因爲這個問題還涉及到match match和loops之間的性能比較方面 –

+0

完全一樣:另一個問題的'v'向量在這裏用'names(df)'表示(順便說一句,是*一個向量)。你想找到另一個矢量元素的位置;第二個向量由'data.frame'的列名錶示的事實是完全不相關的。 – nicola

+0

我尊敬地不同意,但不會討論它。此外,FWIW,我在看,你的回答早於@ DavidArenburg的(現在刪除)評論,其中包含相同的答案,所以你不必擔心:) –

1

考慮sapply()內部爲for循環;它遍歷COLUMNNAMES的列表,然後應用grep/which

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