TwitterのAPIを使って分析をしている過程で、どうしてもURLのドメイン名を取得したいという状況に直面したものの、正規表現が苦手。そこで、今回はRのstringr
パッケージを使用して、正規表現が苦手な人でもごり押しでURLからドメイン名を取得する方法を備忘録も兼ねて書きます。(そんな人いるか知りませんが。)
適当なデータフレームを用意する
とりあえず適当にブラウザのタブに並んでいるURLをペタペタ貼って、data.frameオブジェクトを作りました。
df <- data.frame(id = 1:4,
url = c("https://developer.twitter.com/en/docs/twitter-api/data-dictionary/object-model/tweet",
"https://qiita.com/yuhi62320/items/d1193a03392458e99416",
"https://www.instagram.com/kannahashimoto.mg/?hl=ja",
"https://www.youtube.com/watch?v=swZVrg3H-8E"
)
)
View(df$url)
このURLのリンクから、ドメイン名を取得したいのですが、正規表現が苦手すぎるので楽して実行できるものはないものか。。。
よく見ると、URLは、/(スラッシュ)で分割することによってある程度ブロックを分けられそうです。
しかも幸いなことに、ドメイン名はhttp(s)の直後に来るので、割とシンプルに獲得できそう。
というわけで、今回は、正規表現が苦手すぎる私が、stringrパッケージを使ってゴリ押しでドメイン名を獲得していきます。
#stringrを使ってゴリ押しでドメイン名を獲得する。
今回はtidyverseで。stringrも同時にロードされます。
library(tidyverse)
df_url_split <- str_split_fixed(df$url, "/", n=4) %>%
data.frame()
View(df_url_split)
str_split_fixed(stirng, pattern, column_number)
は、指定したパターンを基に文字列を分割し、ベクトルとして保存してくれます。
今回は、df$url
をpattern = "/"
で分割し、その結果を要素数4のベクトルに分割し、それをdata.frame
としてまとめています。n = 4
としているのは、これより少ないとドメイン名以前にある"/"の数が足りず、ドメイン名を独立して分割させられないから。
こちらもよく見れば、各ドメインがX3の列にまとまっていることがわかります。ドメイン名の前に/が3個あるので、3番目の列に格納されているんですね。
あとは、いらない部分を取り除いて成形するだけ。
df <- df %>%
cbind(df_url_split) %>%
mutate(domain_name = X3) %>%
select(-c(X1,X2,X3,X4))
View(df)
無事にドメイン名を取得できました。
正規表現が得意な方はよりスマートな方法を教えてください。ぜひ。