歩いたら休め

なんでこんな模様をしているのですか?

【R】RでPythonの"str".isdigit()みたいな操作

ルールに従っているidがあって、「idの冒頭2文字が数字かどうか」をチェックしたい案件がありました。

example_ids <- c("01_orange_0001001", "09_red_0001001", "aa_purple_0002002")

Pythonであれば文字列のスライスとis_digitメソッドで簡単にチェックすることができます。

example_ids = ["01_orange_0001001", "09_red_0001001", "aa_purple_0002002"]

# 冒頭2文字をスライスで取り出す
markets = [x[0:2] for x in example_ids]
print(markets)
# ['01', '09', 'aa']

# 冒頭2文字が数字かどうかをチェックする
answer = [x.isdigit() for x in markets]
print(answer)
#[True, True, False]

Rでも似たことをできないか調べたところ、stack over flowの記述を見つけ、正規表現とgrepl関数で簡単に実現できました。

grepl("^[0-9]{2}", example_ids) #冒頭2文字が0-9であるという正規表現
#=> [1]  TRUE  TRUE FALSE

数字でない文字列をNAが返ることを利用して、次のように実装することもできるようです。warning出ちゃうのでイケてないですけど。

# warning出るけど
!is.na(as.integer(substr(example_ids, 1, 2)))
# => [1] FALSE FALSE FALSE
# Warning message:
# NAs introduced by coercion