2012-02-05 13 views
2

ベクトルの要素に番号を付け、ベクトルの最小要素に「1」を割​​り当てたいとします。私はこれを行う方法を知っていますが、私の解決策(以下に含まれるコード)はあまりにも複雑です。はるかに簡単なソリューションはありますか?R:ベクトルの番号要素

私の例では、ベクトル 'data'に5つの一意の数字があります。番号3は最小で、番号 '1'を割り当てる必要があります。番号100が最も大きく、番号 '5'が割り当てられる必要があります。

ベクトル 'データ'の望ましい解決策は、c(2,3,4,4,3,1,5)です。

data <- c(5,8,12,12,8,3,100) 
unique.numbers <- sort(unique(data)) 
numbering <- seq(1:length(unique(data))) 
template <- cbind(numbering,unique.numbers) 
output <- rep(NA, length(data)) 
for(i in 1:length(data)) { 
    for(j in 1:dim(template)[1]) { 
     if(data[i]==template[j,2]) output[i]=j 
    } 
} 
output 

ありがとうございました。私は私のプログラミングをより効率的にしようとしています。

マーク・ミラー

答えて

6

プログラムのよりコンパクトなバージョン。

dat <- c(5,8,12,12,8,3,100) 
dat_sorted <- sort(unique(dat)) 
match(dat,dat_sorted) 
+0

+1いいです。直感的でクリーンな –

3

あなたは、数値または整数データを使用している場合は、サイドノートとして、あなたはその以来Rに変数名としてdataを使用しないでください、またas.numeric(factor())

dat <- c(5,8,12,12,8,3,100) 
as.numeric(factor(dat)) 

を使用することができますすでに組み込み関数です。

+0

重要な修正(R FAQ 7.10を参照): 'as.numeric(as.character(factor))')またはあなたは悲しいでしょう。 –

+1

サイドノートが間違っています、 'data'は* R *の変数名ではなく、関数名であり、それに大きな違いがあります。 –

+0

@SimonUrbanekそれは私が言うことを試みたものです。混乱させて申し訳ありません。 CarlWitthof、良い点。上記のWojciechの答えははるかに良い選択肢です。 – Justin

2

別の可能性としては、次のとおりです。

> rank(data) 
[1] 2.0 3.5 5.5 5.5 3.5 1.0 7.0 

あなたはネクタイを処理する方法の引数「ties.method」を参照してくださいすることができます。

+0

私は "ties.method"のどれもが望ましい結果を与えるとは思わない。 – Dason

+0

@Dasonが同意しました。しかし、(1)私はuser1184072が彼の出力形式に結婚しているとは確信していません。(2)彼がいれば、それはより良い場所かもしれません。 –

関連する問題