2011-07-18 1 views
2

データセットには正と負の2つの列があります。デカルト空間にプロットした場合にどの象限が表示されるかを反映する第3の列を作成したいと思います。2つの列の正または負の値に基づいて象限を定義します。

たとえば、列Aが正で、列Bが正である場合、列Cは "I"を記録します。列Aが負で、列Bが負の場合、列Cは "III"を記録します。

私は、データセット内の行全体にif else機能でこれを行うと、その後loopまたはapplyでき疑うが、if elseを書くために、私の試みはこれまで失敗しています。

答えて

2

さて、次は1と4の間で、あなたに値を与えるだろう:

C <- (A<0) + (B<0)*2L + 1L 

をこれが1回で全体の列を変換します。魔法はFALSE/TRUEが0/1として扱われることにあり、あなたは数学を行うことができます。 2と1の代わりに2Lと1Lを使用すると、変換を強制的に2倍にするのではなく、整数として結果を保持します(これは遅くなり、メモリが増えます)。

は、その後、あなたがこれらの象限にマップすると仮定すると:

 +B 
     | 
    II | I 
-A -----+---- +A 
    III | IV 
     | 
     -B 

をあなたがこの(data.frameを使用するように更新)を使用することができます:あなたがしたい場合

# Sample data.frame with columns a & b 
d <- data.frame(a=c(1,-1,-1,1), b=c(1,1,-1,-1)) 

quadrantNames <- c('I', 'II', 'IV', 'III') # Your labels... 
d <- within(d, c <- quadrantNames[(a<0) + (b<0)*2L + 1L]) 
head(d) # print data 
    a b c 
1 1 1 I 
2 -1 1 II 
3 -1 -1 III 
4 1 -1 IV 

...とをラベルの順序をquadrantNamesに変更するだけです。

+0

私は狂っているのですか、あるいはそれらの不平等が他の方向に進むことを望んでいますか? – joran

+0

[編集]ジョランは正解ですが、不等式は逆になるはずです。そのような迅速な対応のおかげで、両方のおかげで!それは私が心に留めていたものよりずっと簡単でした。好奇心から、 "L"は何を表していますか? – jslefche

+0

@jslefche - Lは、Rに二重ではなく整数を格納するように指示しています。十分なR関数を見れば、コードを高速化できるので、このトリックを頻繁に見つけることができます。 – joran

関連する問題