2016-07-13 6 views
1

です。データフレームの列の順に番号を取得したいと考えています。列の順番はR

df <- data.frame(item = rep(c('a','b','c'), 3), 
      year = rep(c('2010','2011','2012'), each=3), 
      count = c(1,4,6,3,8,3,5,7,9)) 

私が探している機能は、columnorderです。私はこの結果を持っています

x <- columnorder(df$count) 
x 
> 3 

x <- columnorder(df$item) 
x 
> 1 

これは基本的な仕事のようですが、私は今まで答えを見つけることができませんでした。私はあなたの助けに感謝します。 @mtotoのコメントで提案されているように、あなたに

+2

これは(ジョブを 'しcolnames(df)== "count") ' – mtoto

答えて

1

あなたが言った、

それは基本的な作業のように思えるが、私は答えを見つけることができませんでした今まで。何をしようとする一般的な意味で

- 列インデックスにカラム名を翻訳 - 基本的な、そしてかなり一般的な質問です。しかし、あなたの入力がobject_name$column_nameの形式である上で説明した特定のシナリオは、あなたが達成しようとしている非典型的なWRTです。これは、既存の解決策が見つからなかった可能性が高いためです。要するに

、問題はあなたがdf$countとして引数を渡すときdf$countc(1,4,6,3,8,3,5,7,9)として評価されますので、あなたにもちょうど、代わりにc(1,4,6,3,8,3,5,7,9)を使用していることです。もちろん、Rは少し余分な作業で、このは例

column_order <- function(expr) { 
    x <- strsplit(deparse(substitute(expr)), "$", TRUE)[[1]] 
    match(x[2], names(get(x[1]))) 
} 

column_order(df$item) 
#[1] 1 
column_order(df$year) 
#[1] 2 
column_order(df$count) 
#[1] 3 

しかし、私は、これは何のために非定型のインターフェースである、上記に述べたようにするために、と実装することができるよう、メタプログラミングの公平なビットを可能にしあなたは最終的にやろうとしています。より多くの標準的なアプローチは、引数として(典型的には文字列のような)列名と対象物を受け入れるように、この機能のためであろう解決策は非常に簡単である場合には:

column_order2 <- function(col, obj) match(col, names(obj)) 

column_order2("item", df) 
#[1] 1 
column_order2("year", df) 
#[1] 2 
column_order2("count", df) 
#[1] 3 
+0

詳細な答えのための@nrussellありがとうございます。私の世界はもう一度拡張されています:) – Vinh

1

ありがとう、ここに一つの解決策である:

x <- which(colnames(df) == "count") 
+0

私は大変申し訳ありませんが、私はコメント欄を見るのを忘れていました。 – snoram

+0

@mtotoとsnoramありがとう、私はあなたのソリューションが迅速かつ簡単である方法が好きです – Vinh