2017-12-15 4 views
1

値のリストが値の範囲内にあるかどうかを確認してから、特定の値を割り当てる必要があります。私はifelse()ステートメントを入れ子にすることなく、これを行う方法を見つけたい(ちょうどifelseは51回以上ネストすることができず、ひどいと思われる)。数値を複数の比較演算子と値と比較する

これは実例であるため、これを行うための一般的な方法があるかどうかは疑問です(ループ?*適用など)。私はpaste(eval())と何かを考えていますが、それを働かせることはできません。前もって感謝します。

set.seed(2222) 
comparison_table = data.frame(
    lower_comp = c('>=', '>=', '>='), 
    upper_comp = c('<', '<', '<'), 
    lower_value = c(3, 33, 100), 
    upper_value = c(31, 40, 120), 
    new_value = c(1, 2, 3) 
) 

df = data.frame(
    value = runif(n = 25, min = 1, max = 130) 
) 

df$new_value = with(df, 
    ifelse(value >= 3 & value < 33, 1, 
    ifelse(value >= 33 & value < 100, 2, 
    ifelse(value >= 100 & value < 120, 3, NA)))) 

value   new_value 
48.427905  NA 
24.461992  1 
107.576807  3 
76.461703  NA 
124.694209  NA 
14.132063  1 
98.638509  NA 
32.436195  NA 
88.470441  NA 
9.095131   1 
49.548878  NA 
85.647608  NA 
75.357280  NA 
120.696858  NA 
113.347924  3 
51.364939  NA 
126.896975  NA 
128.282762  NA 
115.333414  3 
75.022578  NA 
128.170932  NA 
2.200451   NA 
24.085131  1 
99.672971  NA 
24.945700  1 
+2

lower_comp列とupper_comp列が常に同じ値をとる場合は、 'library(data.table);があります。 setDT(df); df [comparison_table、on =(値> = lower_value、値 Frank

答えて

3

あなたの値ベクトルを分割するcut()を使用することができます作るために

[3,33) 
[33,100) 
[100,120) 

使用right = FALSE

df$new_value <- cut(df$value, breaks= c(3,33,100,120),labels=FALSE, right = FALSE) 

これは、3つの区間を(外のものがNAがデフォルトになります)を定義します左側を含む:デフォルトは(x, y]で、[x, y)が必要です。

+0

助けてくれてありがとう。これは間違いなく私が立てたケースのために働く。私は台無しにして、間隔が '注文された'私は質問を更新したことを認識していませんでした。私は、必要な条件で文字列を '貼り付け 'でき、data.frameでそれを評価できるような解決策を考え出しています:' df $ new_value [parse(eval(text = paste0(' value > = 3 '))] = 1'のコードコンパイル..... – bringtheheat

+0

@bringtheheatその場合、 'grep(")で入力不等式をチェックする 'cut()'の周りに小さなラッパー関数を書くでしょう。あなたのブレークのリストを取る 'unique(c(comparison_table $ lower_value、comparison_table $(==)、comparison_table $ lower_comp)'、そして 'TRUE'ならば' right < - FALSE'、そうでなければ 'right <あなたの不等式が一様である場合、すなわち、 "> =と<" or ">と<="の後ろにある場合にのみ当てはまります。 – Mako212

+0

@bringtheheat実際には私は比較テーブルをフォーマットしません私はちょうど2つの列を持っています.1つは休憩用、もう1つは左右の間隔かどうかを定義する列です。 – Mako212