と。

Github: https://github.com/8-u8

九捨十入(年代変数の簡単な作り方)

シチュエーション

  • 卒業論文やお仕事でアンケートをとった.
  • 年齢の選択肢つけるのめんどくさかったので実年齢入れてもらった
  • 年齢と何かのクロス集計をかけたいが,実年齢は整数なのでめんどい
  • 10歳刻みの年代でくくりたいなあ.

関数

こんな感じ.関数にしなくても別にいい.

thFunc <- function(Vec){
  Vec[Vec%%10 != 0] <- Vec[Vec%%10 != 0] %%10 *10  
  return(Vec)
}
thFunc(c(14,15,99,40,56,22))
> [1] 40 50 90 40 60 20

解説

%%演算子は剰余を返す.また,%/%演算子は整数部の商を返す. ここでは10歳刻みの年代がほしいので,10で割った時の剰余を判定し, 剰余が0でない場合は10で割った際の商の10倍を返す. 5歳刻みにしたいなら10としている部分を5とすればよい.

ちなみに

Rにはround関数があり,digits = -1とすると整数部第1位を丸めてくれるが,IEEE式で数値を丸めるため, 例えば25歳は20歳に丸められてしまい,26歳は30歳に丸められてしまう.違う,そうじゃない.

なおpythonでは以下のようにかけば同じような結論を得られる.

 def thFunc(lst):
     for i in range(0, len(lst)):
         if lst[i] % 10 != 0:
             lst[i] = lst[i] // 10 * 10
     return lst

thFunc([34,55,63,55,20,19])
[30, 50, 60, 50, 20, 10]

あるいは

def thFunc(lst): return [lst[i] //10 *10 for i in range(0,len(lst)) if lst[i] % 10 != 0]
thFunc([34,55,63,55,20,19])
[30, 50, 60, 50, 20, 10]

小話でした.

追記

あえて小数にしてからfloor(床関数)使って10倍すれば同じ結果が得られる上短く済むじゃん…… くまきち氏に感謝.

floor(c(14,15,99,40,56,22)/10)*10
[1] 10 10 90 40 50 20

さらに

Atsusy氏「多分コレが一番早いと思います」

ぼく「ミ゜」

> c(14,15,99,40,56,22) %/% 10 * 10
[1] 10 10 90 40 50 20

さすがRおじさん……

結論,別に剰余という情報はいらず,「10の位だけ残す」ことができればいいコトがわかってきた.

シンプルな方がバグもなくていいので,ライブラリ使わないPythonだと

lst = [34,55,63,55,20,19]
[lst[i] //10*10 for i in range(0,len(lst))]