はじめに

チュートリアルの概要

 このチュートリアルでは,『事例で学ぶ経済・政策分析のためのGIS入門』の本文や付録で扱われているRの各種操作について解説します.特に,R言語の特徴であるベクトル処理や,各種データハンドリングといった,空間分析に限らない様々なデータ分析一般で重要なトピックをカバーしています.もし,Rを使った経験がない場合,まずはこちらの内容を一通り学んだ上で,演習を行うことをお勧めします.
 このチュートリアルの内容は,以下のRStudio Cheatsheetsに沿ったものですので,合わせて参照ください.

RStudio Cheatsheetsにはその他,書籍の本文中でも用いられている,データ可視化のためのパッケージggplot2や,空間解析のためのパッケージsfを始めとして,様々なパッケージのチートシートが用意されています.

さらなる学習のために(このチュートリアルの参考文献集)

 Rを基礎から学ぶ上で役に立ついくつかの文献をリストアップしておきます.まず,書籍としては以下のものがお勧めです.

『Rユーザのための』は,本チュートリアルでも登場するデータ処理に特化したパッケージ群tidyverseに関する解説のほか,可視化パッケージggplot2やWEBスクレイピング,RStudioを用いたレポーティングに関する内容を網羅しています.『ゼロからはじめる』は,RとPython両方について,基本的操作から機械学習の初歩までを解説しています.『The R Tips』はRにデフォルトで実装されている関数群に関しての解説が詳しいです.

 また,WEBページとしては,以下のものがお勧めです.

「卒業論文のための」は,Rをゼロから学ぶ初心者にとって非常に役に立つチュートリアルで,基本的操作から回帰分析までを解説しています.動画解説もセットになっている点が大きな特徴です.「私たちのR」は,一通りRの基礎を学び終わった人が,さらに発展的なデータ操作を行う場合に役に立つチュートリアルです.英語ですが,「Big Book of R」は数多あるRのWEBチュートリアルに関する(筆者が知る限り)最大のまとめサイトです.

電卓としてRを使う

 Rでは,数値(スカラー)の四則演算はもちろん,指数・対数関数等を扱うことができます.なお「#」で始まる行はRではコメントとして認識され,プログラムとしては実行されません.

四則演算

#足し算
1+1
## [1] 2
#引き算
5-3
## [1] 2
#掛け算
2*5
## [1] 10
#割り算
4/2
## [1] 2

指数・対数関数

#2の二乗
2^2
## [1] 4
#2の平方根
sqrt(2)
## [1] 1.414214
#底を2とする4の対数値
log(x=4,base=2)
## [1] 2
#ネイピア数
exp(1)
## [1] 2.718282
#10の常用対数
log(x=10,base=10)
## [1] 1
#2の自然対数
log(x=2,base=exp(1))
## [1] 0.6931472
log(x=2)
## [1] 0.6931472

ベクトル

数値ベクトル

 最も基礎的な数値ベクトルの作成方法を示します.要素の値をダイレクトに指定するにはc関数を用います.また,連続した整数値のベクトルを作りたい時には,「:」記号を使います.なお,Rの各種関数の使い方や仕様を知りたい場合,「?」という記号を使うとヘルプにアクセスできます.例えばc関数のヘルプを見たい時には,「?c」というプログラムを実行してください.

#1,2,3という要素を持つ数値ベクトルを作成
c(1,2,3)
## [1] 1 2 3
#整数の並びからベクトルを作成
1:6
## [1] 1 2 3 4 5 6

連続した数を要素に持つ数値ベクトルの作成には,seq関数を用いることもできます.

#1:6と同じ
seq(from=1,to=6)
## [1] 1 2 3 4 5 6

seq関数では,連続する数の間隔を指定してベクトルを作成することも可能です.

#1から6まで1刻み
seq(from=1,to=6,by=1)
## [1] 1 2 3 4 5 6
#1から6まで1つ飛ばし
seq(from=1,to=6,by=2)
## [1] 1 3 5
#1から6まで0.5刻み
seq(from=1,to=6,by=0.5)
##  [1] 1.0 1.5 2.0 2.5 3.0 3.5 4.0 4.5 5.0 5.5 6.0

数・ベクトルの繰り返しからベクトルを作成する際には,rep関数を用います.

#1を3回繰り返す
rep(x=1,times=3)
## [1] 1 1 1
#1,2という要素を持つベクトルを3回繰り返す
rep(x=c(1,2),times=3)
## [1] 1 2 1 2 1 2
#1から6までの整数でなるベクトルを3回ずつ繰り返す
rep(x=1:6,times=3)
##  [1] 1 2 3 4 5 6 1 2 3 4 5 6 1 2 3 4 5 6
#1から6までの整数のベクトル「の要素」を3回ずつ繰り返す
rep(x=1:6,each=3)
##  [1] 1 1 1 2 2 2 3 3 3 4 4 4 5 5 5 6 6 6

文字列ベクトル

 文字列を要素に持つベクトルも作れます.文字列は英語以外もOKです.ただし,要素となる文字列は引用符「“」で囲む必要があります.

#dog,catという要素を持つ文字列ベクトルを作成
c("dog","cat")
## [1] "dog" "cat"
#犬,猫という要素を持つ文字列ベクトルを作成
c("犬","猫")
## [1] "犬" "猫"

文字列ベクトルに対しても,rep関数を適用できます.

#dog,catという要素を持つ文字列ベクトルを2回繰り返し
rep(x=c("dog","cat"),times=2)
## [1] "dog" "cat" "dog" "cat"
#dog,catという要素を持つ文字列ベクトル「の要素」を3回ずつ繰り返す
rep(x=c("dog","cat"),each=2)
## [1] "dog" "dog" "cat" "cat"

オブジェクト(変数)への代入

 Rでは,オブジェクトと呼ばれるものを作成し,ベクトルを始めとしたRで生成される様々な値・データなどを代入・格納することが可能です.同じ名前のオブジェクトは,後に作成されたもので上書きされます.また,オブジェクトの名前を付ける際には,例えば以下の事項に注意が必要です.

  • 関数名(例えばここまで出てきたものだと,seqやrep)を使うことは避ける
  • 特殊記号の殆どはR内で特別な役割を持つので,差し障りなくオブジェクト名に使える記号は「_(アンダーバー)」ぐらい
  • 英数字以外の文字列(例えば漢字やひらがな)を使うことは避ける
  • オブジェクト名が半角数字で始まることは避ける
#例えば,オブジェクトnumvecに数値ベクトルを代入
numvec <- c(1,1,6,4,4,4,9,2)
#オブジェクトの中身を表示するには,オブジェクト名を実行する
numvec
## [1] 1 1 6 4 4 4 9 2
#代入記号は,「<-」の他「=」も利用可能
numvec=c(1,1,6,4,4,4,9,2)
numvec
## [1] 1 1 6 4 4 4 9 2

ベクトルへの要素の追加

 ベクトルに新しい要素を追加したり,ベクトル同士を結合したい場合はc関数またはappend関数を使います.

#オブジェクトnumvec1に1つ目の数値ベクトルを代入
numvec1 <- c(1,2,3,4)
#オブジェクトnumvec2に2つ目の数値ベクトルを代入
numvec2 <- c(4,3,2)
#c関数でnumvec1とnumvec2を結合
c(numvec1,numvec2)
## [1] 1 2 3 4 4 3 2
#append関数でnumvec1とnumvec2を結合
append(x=numvec1,values=numvec2)
## [1] 1 2 3 4 4 3 2

データ型の変換

 Rでよく使われるデータ型の間で,相互に型が変換できる場合もあれば,できない場合もあります.その例を示すため,はじめに数値ベクトルnumvecと文字列ベクトルcharvecを作成します.

#オブジェクトnumvecに数値ベクトルを代入
numvec <- c(1,2,3,4)
#オブジェクトcharvecに文字列ベクトルを代入
charvec <- c("dog","cat","mouse")

数値ベクトルをas.character関数を用いて文字列ベクトルに変換します.変換後のベクトルでは,各要素が引用符で囲まれていることがわかります.

#numvecを文字列ベクトルに変換した結果をオブジェクトnumvec_charに代入
numvec_char <- as.character(numvec)
#変換結果を表示
numvec_char
## [1] "1" "2" "3" "4"

 一方,文字列ベクトルを数値ベクトルに変換できる場合は限定されます.ベクトル要素が(何かしらの理由で)文字列型になっている数値である場合は,as.numeric関数で問題なく変換できますが,アルファベット等の純粋な(?)文字列はNA(欠損値)に変換されてしまいます.

#numvec_charを数値ベクトルに変換した結果をオブジェクトnumvec_numに代入
numvec_num <- as.numeric(numvec_char)
#変換結果を表示
numvec_num
## [1] 1 2 3 4
#charvecを数値ベクトルに変換しようとしても,NAに置換されてしまう
as.numeric(charvec)
## [1] NA NA NA

 ちなみに,R特有の型として,因子型(レベルがセットされた文字列)というものがあります.統計モデルなどで用いられることが多いのですが,扱いが煩雑なので,書籍・付録内では用いていません.また,TRUE/FALSEのような変数はブール型の変数と呼ばれ,文字列型・数値型の変数とは明確に区別されます.

ベクトル関数

 ここでは,Rにデフォルトで実装されている基本的なベクトル関数を紹介します.まず,ベクトルxをソートして返す際には,sort関数を用います.

#数値ベクトルのソート(昇順)
sort(x=c(1,6,4,9,2))
## [1] 1 2 4 6 9
#数値ベクトルのソート(降順)
sort(x=c(1,6,4,9,2),decreasing=TRUE)
## [1] 9 6 4 2 1
#英語文字列ベクトルのソート(昇順)
sort(x=c("tokyo","nagoya","osaka"))
## [1] "nagoya" "osaka"  "tokyo"
#英語文字列ベクトルのソート(降順)
sort(x=c("tokyo","nagoya","osaka"),decreasing=TRUE)
## [1] "tokyo"  "osaka"  "nagoya"

ベクトルxの要素の総数を返すには,length関数を用います.

length(x=c(1,6,4,9,2))
## [1] 5

ベクトルxの各要素の個数を返すには,table関数を用います.

#数値ベクトルに対し要素をカウント
table(x=c(1,1,6,4,4,4,9,2))
## x
## 1 2 4 6 9 
## 2 1 3 1 1
#文字列ベクトルに対し要素をカウント
table(x=c("F","F","M","F","M","M","F"))
## x
## F M 
## 4 3

ベクトルxのユニークな値を返すには,unique関数を用います.

#数値ベクトルをユニーク化
unique(x=c(1,1,6,4,4,4,9,2))
## [1] 1 6 4 9 2
#文字列ベクトルをユニーク化
unique(x=c("F","F","M","F","M","M","F"))
## [1] "F" "M"

ベクトル要素へのアクセス

 ベクトル要素へのアクセス方法をいくつか示します.はじめに,アクセス先となる数値ベクトルxを作成します.

x <- c(7,2,8,1,3,9,2,4,2,5)
x
##  [1] 7 2 8 1 3 9 2 4 2 5

位置による指定

#4番目の要素
x[4]
## [1] 1
#4番目以外の要素
x[-4]
## [1] 7 2 8 3 9 2 4 2 5
#2番目から4番目までの要素
x[2:4]
## [1] 2 8 1
#「2番目から4番目まで」以外の要素
x[-(2:4)]
## [1] 7 3 9 2 4 2 5
#1番目および5番目の要素
x[c(1,5)]
## [1] 7 3

値による指定

#値が5に等しい要素
x[x==5]
## [1] 5
#値が5より小さい要素
x[x<5]
## [1] 2 1 3 2 4 2
#値が5より大きい要素
x[x>5]
## [1] 7 8 9
#値が5以下の要素
x[x<=5]
## [1] 2 1 3 2 4 2 5
#値が5以上の要素
x[x>=5]
## [1] 7 8 9 5
#1,2,5のセットに含まれる要素
x[x%in%c(1,2,5)]
## [1] 2 1 2 2 5

名前による指定

 ベクトルの各要素には名前を付けることができます.名前を付ける際にはnames関数を用います.付けたい名前を要素に持つベクトルの要素数は,名前を付ける先のベクトルの要素数と一致する必要があります.

names(x) <- c("Tokyo",
              "Yokohama",
              "Nagoya",
              "Kyoto",
              "Osaka",
              "Kobe",
              "Okayama",
              "Hiroshima",
              "Kokura",
              "Hakata")
x
##     Tokyo  Yokohama    Nagoya     Kyoto     Osaka      Kobe   Okayama Hiroshima 
##         7         2         8         1         3         9         2         4 
##    Kokura    Hakata 
##         2         5

その上で,名前が「Kobe」に等しい要素へのアクセスは,以下のように行います.

x["Kobe"]
## Kobe 
##    9

また,名前が「Tokyo」「Yokohama」の要素を同時に取り出して新たなベクトルにしたい場合は,以下のように行います.

x[c("Tokyo","Yokohama")]
##    Tokyo Yokohama 
##        7        2

ベクトル要素の置換

 ベクトルの要素を別の値に置き換える際に,ベクトル要素へのアクセスが応用できます.以下,先ほど作成したベクトルxを用いて,いくつかの例を示します.実行結果の比較のため,オリジナルのベクトルxをx_origというオブジェクトに代入した上で,各種置換操作を行います.

#オリジナルのベクトルを別のオブジェクトに代入する
x_orig <- x
x_orig
##     Tokyo  Yokohama    Nagoya     Kyoto     Osaka      Kobe   Okayama Hiroshima 
##         7         2         8         1         3         9         2         4 
##    Kokura    Hakata 
##         2         5
#5番目の要素を1に置き換える
x[5] <- 1
#要素を比較
x_orig
##     Tokyo  Yokohama    Nagoya     Kyoto     Osaka      Kobe   Okayama Hiroshima 
##         7         2         8         1         3         9         2         4 
##    Kokura    Hakata 
##         2         5
x
##     Tokyo  Yokohama    Nagoya     Kyoto     Osaka      Kobe   Okayama Hiroshima 
##         7         2         8         1         1         9         2         4 
##    Kokura    Hakata 
##         2         5
#値が5より小さい要素を0に置き換える
x[x<5] <- 0
#要素を比較
x_orig
##     Tokyo  Yokohama    Nagoya     Kyoto     Osaka      Kobe   Okayama Hiroshima 
##         7         2         8         1         3         9         2         4 
##    Kokura    Hakata 
##         2         5
x
##     Tokyo  Yokohama    Nagoya     Kyoto     Osaka      Kobe   Okayama Hiroshima 
##         7         0         8         0         0         9         0         0 
##    Kokura    Hakata 
##         0         5
#名前が「Tokyo」の要素を10に置き換える
x["Tokyo"] <- 10
#要素を比較
x_orig
##     Tokyo  Yokohama    Nagoya     Kyoto     Osaka      Kobe   Okayama Hiroshima 
##         7         2         8         1         3         9         2         4 
##    Kokura    Hakata 
##         2         5
x
##     Tokyo  Yokohama    Nagoya     Kyoto     Osaka      Kobe   Okayama Hiroshima 
##        10         0         8         0         0         9         0         0 
##    Kokura    Hakata 
##         0         5

数値ベクトルの演算

四則演算(スキップ可)

 数値(スカラー)と同様に,ベクトルに対しても四則演算を実行することができます.ベクトル間での四則演算ができるか否かの条件(例えば,ベクトル間で要素数=次元が一致しているか等)について知りたい・復習したい場合は,線形代数のテキストを参照ください.まずは,計算に用いる2つのベクトルを作成します.

x <- c(5,9,1,3)
y <- c(2,6,7,8)

2つのベクトルの「要素間の」四則演算は以下のように行えます.

#足し算
x+y
## [1]  7 15  8 11
#引き算
x-y
## [1]  3  3 -6 -5
#掛け算
x*y
## [1] 10 54  7 24
#割り算
x/y
## [1] 2.5000000 1.5000000 0.1428571 0.3750000

ベクトル特有の演算として,内積は以下のように計算することができます.

x%*%y
##      [,1]
## [1,]   95

ベクトル単位での指数・対数関数

 指数・対数関数をベクトルに対して実行すると,ベクトルの各要素に対して関数を実行した結果が返されます.

#ベクトルxの各要素の二乗
x^2
## [1] 25 81  1  9
#ベクトルxの各要素の平方根
sqrt(x)
## [1] 2.236068 3.000000 1.000000 1.732051
#ベクトルxの自然対数
log(x=x,base=exp(1))
## [1] 1.609438 2.197225 0.000000 1.098612

ベクトル集合演算

 2つのベクトル間で共通する要素の抽出や,ベクトルを集合と見做して差分を取ることができます.まず,2つの文字列ベクトルx,yを作成します.

x <- c("Tokyo",
       "Yokohama",
       "Nagoya",
       "Kyoto",
       "Osaka")
y <- c("Tokyo",
       "Saitama",
       "Chiba",
       "Yokohama")

2つのベクトル間で,和集合,積集合,差集合を取ると,以下のようになります.

#和集合(xに含まれる or yに含まれる)
union(x,y)
## [1] "Tokyo"    "Yokohama" "Nagoya"   "Kyoto"    "Osaka"    "Saitama"  "Chiba"
#積集合(xに含まれる and yに含まれる)
intersect(x,y)
## [1] "Tokyo"    "Yokohama"
#差集合(xに含まれるがyに含まれない)
setdiff(x,y)
## [1] "Nagoya" "Kyoto"  "Osaka"

統計関数

 数値ベクトルついて,最大・最小要素の抽出や,要素の平均値などの計算が行えます.ここでは,10個の要素でなる数値ベクトルを作成した上で,各種統計関数を実行します.

#数値ベクトルの作成
x <- c(14,80,43,55,35,24,81,47,99,70)
#要素の最大値
max(x)
## [1] 99
#要素の最小値
min(x)
## [1] 14
#要素の合計値
sum(x)
## [1] 548
#要素の平均値
mean(x)
## [1] 54.8
#要素の中央値
median(x)
## [1] 51
#要素の分散
var(x)
## [1] 745.7333
#要素の標準偏差
sd(x)
## [1] 27.30812

文字列

 文字列(ベクトル)を用いた基礎的な操作を以下にまとめます.最初に,各種操作の解説に用いる2つの文字列ベクトルを作成します.

tokaido <- c("Tokyo",
             "Yokohama",
             "Nagoya",
             "Kyoto",
             "Osaka")
kanto <- c("Tokyo",
           "Saitama",
           "Chiba",
           "Yokohama")

以下,各種操作の例を示します.

#ベクトルを複数個つなげる
paste(x=tokaido,y=kanto,sep=" ")
## [1] "Tokyo Tokyo"      "Yokohama Saitama" "Nagoya Chiba"     "Kyoto Yokohama"  
## [5] "Osaka Tokyo"
#ベクトルに対して一つの文字列をつなげる(引数sepはつなげる時の区切り文字)
paste(x=tokaido,y="Station",sep="_")
## [1] "Tokyo_Station"    "Yokohama_Station" "Nagoya_Station"   "Kyoto_Station"   
## [5] "Osaka_Station"
#スペースなしでつなげたい場合は2つの方法がある
paste(x=tokaido,y="Station",sep="")
## [1] "TokyoStation"    "YokohamaStation" "NagoyaStation"   "KyotoStation"   
## [5] "OsakaStation"
paste0(tokaido,"Station")
## [1] "TokyoStation"    "YokohamaStation" "NagoyaStation"   "KyotoStation"   
## [5] "OsakaStation"
#ベクトルの中の要素をつなげる(引数sepはつなげる時の区切り文字)
paste(x=tokaido,collapse=" ")
## [1] "Tokyo Yokohama Nagoya Kyoto Osaka"
#引数patternで指定する文字列を含む要素番号
grep(pattern="yo",x=tokaido)
## [1] 1 4
#各要素が引数patternで指定する文字列を含むか判定
grepl(pattern="yo",x=tokaido)
## [1]  TRUE FALSE FALSE  TRUE FALSE
#引数patternで指定した文字列を含む要素のみ抽出
tokaido[grepl(pattern="yo",x=tokaido)]
## [1] "Tokyo" "Kyoto"
#マッチする文字列を置換する
gsub(pattern="yo",replace="o",x=tokaido)
## [1] "Toko"     "Yokohama" "Nagoya"   "Koto"     "Osaka"

行列

 『事例で学ぶGIS入門』の中では,行列を用いた各種演算はあまり用いられず,単にベクトルを複数列(あるいは複数行)束ねたものとして扱うのみです.故にここでの解説も,あくまで行列の行・列や要素へのアクセスに関するものに留め,演算に関する解説は最低限とします.数値ベクトルの演算と同様,行列演算を行う上での各種条件を知りたい・復習したい場合は,線形代数のテキストを参照ください.

行列の操作

行列の作成

 行列を作成する際には.matrix関数を用います.引数dataには行列の要素を与えるベクトル,nrowには行列の行数,ncolには列数を指定します.ベクトルの型は数値型でも文字列型でも構いませんが,各種演算が行えるのは数値型に限られます.最初に,数値行列の作成例を示します.

#9個の要素を持つ数値ベクトルの作成
numvec <- c(14,80,43,55,35,24,57,38,33)
#numvecから3×3の行列を作成
nummat_c <- matrix(data=numvec,nrow=3,ncol=3)
nummat_c
##      [,1] [,2] [,3]
## [1,]   14   55   57
## [2,]   80   35   38
## [3,]   43   24   33
#numvecから3×3の行列を作成(要素を行方向に配置したい場合は「byrow=TRUE」とする)
nummat_r <- matrix(data=numvec,nrow=3,ncol=3,byrow=TRUE)
nummat_r
##      [,1] [,2] [,3]
## [1,]   14   80   43
## [2,]   55   35   24
## [3,]   57   38   33
#numvecから9×1の行列を作成
nummat_v <- matrix(data=numvec,nrow=9,ncol=1)

次に,文字列行列の作成例を示します.

#6個の要素を持つ文字列ベクトルの作成
charvec <- c("Tokyo",
             "Yokohama",
             "Nagoya",
             "Kyoto",
             "Osaka",
             "Kobe")
#charvecから3×2の行列を作成
charmat <- matrix(data=charvec,nrow=3,ncol=2)
charmat
##      [,1]       [,2]   
## [1,] "Tokyo"    "Kyoto"
## [2,] "Yokohama" "Osaka"
## [3,] "Nagoya"   "Kobe"

行列の結合

 行列は行方向・列方向に結合することができます.行方向の結合の際にはrbind関数,列方向の結合の際にはcbind関数を用います.なお,rbind・cbind関数は,後で解説するデータフレームにおいても適用できます.

#行結合
rbind(nummat_c,nummat_r)
##      [,1] [,2] [,3]
## [1,]   14   55   57
## [2,]   80   35   38
## [3,]   43   24   33
## [4,]   14   80   43
## [5,]   55   35   24
## [6,]   57   38   33
#列結合
cbind(nummat_c,nummat_r)
##      [,1] [,2] [,3] [,4] [,5] [,6]
## [1,]   14   55   57   14   80   43
## [2,]   80   35   38   55   35   24
## [3,]   43   24   33   57   38   33

行・列や要素へのアクセス

 上で作成した文字列行列charmatを用いて,各種アクセス方法を以下に示します.

#2行目にアクセス
charmat[2,]
## [1] "Yokohama" "Osaka"
#1列目にアクセス
charmat[,1]
## [1] "Tokyo"    "Yokohama" "Nagoya"
#(2,2)要素にアクセス
charmat[2,2]
## [1] "Osaka"

ベクトルの場合と同じく,行・列や要素へのアクセスは行列要素の置換にも応用できます.

#行列の2行目を置換する
charmat[2,] <- c("Kawasaki","Sakai")
charmat
##      [,1]       [,2]   
## [1,] "Tokyo"    "Kyoto"
## [2,] "Kawasaki" "Sakai"
## [3,] "Nagoya"   "Kobe"

行列演算(スキップ可)

 上で作成した2つの数値行列を用いて,各種行列演算の方法を示します.それに先立ち,各数値行列の中身を今一度示します.

#1つ目の数値行列
nummat_c
##      [,1] [,2] [,3]
## [1,]   14   55   57
## [2,]   80   35   38
## [3,]   43   24   33
#2つ目の数値行列
nummat_r
##      [,1] [,2] [,3]
## [1,]   14   80   43
## [2,]   55   35   24
## [3,]   57   38   33

2つの行列の「要素間」の演算は,以下のように行えます.

#足し算
nummat_c+nummat_r
##      [,1] [,2] [,3]
## [1,]   28  135  100
## [2,]  135   70   62
## [3,]  100   62   66
#引き算
nummat_c-nummat_r
##      [,1] [,2] [,3]
## [1,]    0  -25   14
## [2,]   25    0   14
## [3,]  -14  -14    0
#掛け算
nummat_c*nummat_r
##      [,1] [,2] [,3]
## [1,]  196 4400 2451
## [2,] 4400 1225  912
## [3,] 2451  912 1089
#割り算
nummat_c/nummat_r
##          [,1]      [,2]     [,3]
## [1,] 1.000000 0.6875000 1.325581
## [2,] 1.454545 1.0000000 1.583333
## [3,] 0.754386 0.6315789 1.000000

行列特有の演算として,例えば行列の転置,逆行列の計算,行列間の積の計算を行うと,以下のようになります.

#行列の転置(nummat_cを例に)
t(nummat_c)
##      [,1] [,2] [,3]
## [1,]   14   80   43
## [2,]   55   35   24
## [3,]   57   38   33
#逆行列(nummat_cを例に)
solve(nummat_c)
##              [,1]        [,2]         [,3]
## [1,] -0.008594772  0.01581014 -0.003360096
## [2,]  0.035581650  0.07034980 -0.142468079
## [3,] -0.014678315 -0.07176458  0.138294486
#行列間の積
nummat_c%*%nummat_r
##      [,1] [,2] [,3]
## [1,] 6470 5211 3803
## [2,] 5211 9069 5534
## [3,] 3803 5534 3514

リスト

 リストとは,データ型の要素をまとめて一つにしたものです.要素数が異なる複数のベクトルをまとめることはもちろん,ベクトル・行列・数値(スカラー)という異なる種類のオブジェクトをまとめることもできます.

リストの作成

 例えば,ここまでで作成したベクトル・行列・数値(スカラー)をまとめたリストを作成します.まず,まとめる対象となるオブジェクトは以下の通りで,文字列ベクトルcharvec,数値行列nummat_c,文字列「Shinkansen」です.

charvec
## [1] "Tokyo"    "Yokohama" "Nagoya"   "Kyoto"    "Osaka"    "Kobe"
nummat_c
##      [,1] [,2] [,3]
## [1,]   14   55   57
## [2,]   80   35   38
## [3,]   43   24   33
"Shinkansen"
## [1] "Shinkansen"

リストの要素xにベクトルcharvecを,yに行列nummat_cを,zに文字列”Shinkansen”を格納します.

l <- list(x=charvec,
          y=nummat_c,
          z="Shinkansen")

リストの要素へのアクセス

 リストの要素には,要素番号と要素名の両方を用いてアクセスすることができます.

#2番目の要素にアクセス
l[[2]]
##      [,1] [,2] [,3]
## [1,]   14   55   57
## [2,]   80   35   38
## [3,]   43   24   33
#名前がzの要素にアクセス
l$z
## [1] "Shinkansen"

データフレーム

 データフレームは,リストに含まれる全ての要素の長さが同じという特別なケースです.統計分析等に用いられるデータ型の殆どはデータフレームなので,特に様々な扱い方を習得する必要性が高いです.故に,詳細なハンドリング方法の解説は,後の「データフレーム操作」のセクションで行います.

データフレームの作成

 まず,データフレームの要素となる2つのベクトルを作成します.ひとつは数値ベクトル,もうひとつは文字列ベクトルです.

charvec <- c("Fukuoka",
             "Saga",
             "Nagasaki",
             "Kumamoto",
             "Oita",
             "Miyazaki",
             "Kagoshima")
numvec <- 40:46

これら2つのベクトルを元に,data.frame関数を用いてデータフレームを作成します.要素xにcharvec,yにnumvecを代入します.

df <- data.frame(x=charvec,y=numvec)

要素名(あるいは変数名)は,「オブジェクト(変数)への代入」セクションでの解説等に留意しつつ,任意に決めることができます.ここでは,要素pref_nameにcharvec,pref_idにnumvecを代入します.

df <- data.frame(pref_name=charvec,pref_id=numvec)

行・列や要素へのアクセス

 行列やリストと同様の手順で,データフレームの行・列や要素へのアクセスが可能である.以下で,いくつかの具体例を示します.

#2行目にアクセス
df[2,]
##   pref_name pref_id
## 2      Saga      41
#1列目にアクセス
df[,1]
## [1] "Fukuoka"   "Saga"      "Nagasaki"  "Kumamoto"  "Oita"      "Miyazaki" 
## [7] "Kagoshima"
df[[1]]
## [1] "Fukuoka"   "Saga"      "Nagasaki"  "Kumamoto"  "Oita"      "Miyazaki" 
## [7] "Kagoshima"
#(2,2)要素にアクセス
df[2,2]
## [1] 41
#列pref_nameにアクセス
df[,"pref_name"]
## [1] "Fukuoka"   "Saga"      "Nagasaki"  "Kumamoto"  "Oita"      "Miyazaki" 
## [7] "Kagoshima"
df$pref_name
## [1] "Fukuoka"   "Saga"      "Nagasaki"  "Kumamoto"  "Oita"      "Miyazaki" 
## [7] "Kagoshima"

データフレームの中身を調べる

 データフレームの構造を知るためのいくつかの方法をここでは示します.なお,これら関数の殆どは,ベクトル・行列・リストにも適用可能です.

#行数を表示
nrow(df)
## [1] 7
#列数を表示
ncol(df)
## [1] 2
#行数・列数を表示
dim(df)
## [1] 7 2
#構造の概要を表示
str(df)
## 'data.frame':    7 obs. of  2 variables:
##  $ pref_name: chr  "Fukuoka" "Saga" "Nagasaki" "Kumamoto" ...
##  $ pref_id  : int  40 41 42 43 44 45 46

プログラミング

For文

 RでのFor文(繰り返しを記述する構文)は以下のようになる.シークエンスには,数値ベクトルや文字列ベクトルが用いられます.

for(変数名 in シークエンス){
処理
}

For文の例

 1から4の数字について,10を足して表示するという処理を各々行います.その際シークエンスには,1から4の整数を要素に持つ数値ベクトルを用います.

for(i in c(1,2,3,4)){
  #シークエンスとなるベクトルのi番目の要素に10を足し,オブジェクトjに代入
  j <- i+10
  #オブジェクトjの値を表示
  print(j)
}
## [1] 11
## [1] 12
## [1] 13
## [1] 14

While文

 RでのWhile文(ある条件が満たされている限り処理を続ける構文)は以下のようになります.

while(条件){
処理
}

While文の例

 iの値が5より小さいという条件(i<5)が満たされている限り,iに1を足し続けるという処理を行います.

while(i<5){
  #iに1を足す
  i <- i+1
}
#最終的なiの値
i
## [1] 5

If文

 RでのIf文(条件に応じて処理内容が分岐する構文)は以下のようになります.

if(条件1){
処理1
}else if(条件2){
処理2
}else{
処理3
}

条件1を満たせば処理1が,条件1を満たさないが条件2を満たせば処理2が,条件1・2両方を満たさなければ処理3が実行されます.

If文の例

 変数xが10よりも大きければ「dog」と表示,xが10以下かつ5よりも大きければ「cat」と表示,xが以下かつ0よりも大きければ「mouse」,これら条件にxが当てはまらなければ「I don’t Know」と表示します.

#変数xに7という値を代入
x <- 7
#xの値に応じて下のif文を実行(x=7なら結果はcatになるはず)
#もしxが10より大きければ
if(x>10){
  #「dog」と表示
  print("dog")
  #xが5よりも大きければ
}else if(x>5){
  #「cat」と表示
  print("cat")
  #xが0よりも大きければ
}else if(x>0){
  #「mouse」と表示
  print("mouse")
  #上記どの条件にも当てはまらなければ
}else{
  #「I don't know」と表示
  print("I don't know")
}
## [1] "cat"
#変数xに2という値を代入
x <- 2
#xの値に応じて下のif文を実行(x=2なら結果はmouseになるはず)
if(x>10){
  print("dog")
}else if(x>5){
  print("cat")
}else if(x>0){
  print("mouse")
}else{
  print("I don't know")
}
## [1] "mouse"

関数

 Rでは,入力された値(引数)に応じて,(多くの場合)複数の処理を実行し,実行結果(返り値)として出力する手続きを関数として記述することができます.Rでの関数の構文は以下のようになります.

関数名 <- function(引数){
処理
return(返り値)
}

関数の例

 引数xの値を二乗した結果を返り値とする関数を定義します.

#引数をxとする関数を定義
square <- function(x){
  #引数として渡されたxの値を二乗し,変数squaredに代入する
  squared <- x*x
  #squaredの値を返り値として出力する
  return(squared)
}

引数x=5として上の関数を実行します.

square(x=5)
## [1] 25

apply族

 apply族は,ベクトル・行列・リスト・データフレームに対して,一括して何かしらの関数を適用する時に利用します.出入力するデータの方に応じて異なる関数が用意されていますが,主に用いられる2つの関数を以下では紹介します.それに先立ち,関数を適用する為のベクトル・行列・リストを作成しておきます.

#9個の要素を持つ数値ベクトルの作成
numvec <- c(14,80,43,55,35,24,57,38,33)
#numvecから3×3の行列を作成
nummat <- matrix(data=numvec,nrow=3,ncol=3)
nummat
##      [,1] [,2] [,3]
## [1,]   14   55   57
## [2,]   80   35   38
## [3,]   43   24   33
#3個の要素を持つリストの作成
numlist <- list(x=1:5,y=6:15,z=16:20)
numlist
## $x
## [1] 1 2 3 4 5
## 
## $y
##  [1]  6  7  8  9 10 11 12 13 14 15
## 
## $z
## [1] 16 17 18 19 20

apply

 apply関数は,行列・データフレームに対して,行方向もしくは列方向に関数を適用します.第1引数Xには演算を適用する行列・データフレームを指定します.第2引数MARGINは,行方向で演算を行うならば1を,列方向で行うならば2を指定します.第3引数FUNには,適用したい関数を指定します.FUNに指定する関数は,Rのデフォルト関数や外部パッケージ(詳細は後述)から読み込まれる既存の関数でも,自作の関数でも構いません.まずは,既存関数をFUNの引数としたapply関数の実行例を示します.

#行方向にsum関数を適用し,行列の行和を計算する
apply(X=nummat,MARGIN=1,FUN=sum)
## [1] 126 153 100
#列方向にsum関数を適用し,行列の列和を計算する
apply(X=nummat,MARGIN=2,FUN=sum)
## [1] 137 114 128

 次に,自作関数をFUNの引数としたapply関数の実行例を示します.functionの引数となるxは,第1引数Xに指定された行列・データフレームの各行です.この関数の目的は,行列の各要素を行和で割ることです.apply関数を適用した結果は行列形式で返ってきますが,出力される行列は本来欲しい結果が転置された(行と列が入れ替わった)状態になる点に注意してください.

#行方向にsum関数を適用し,行列の行和を計算する
apply(X=nummat,MARGIN=1,FUN=function(x){
  #行列の行を,その行の要素の和(行和)で割る
  m <- x/sum(x)
  #計算結果を返す
  return(m)
})
##           [,1]      [,2] [,3]
## [1,] 0.1111111 0.5228758 0.43
## [2,] 0.4365079 0.2287582 0.24
## [3,] 0.4523810 0.2483660 0.33

故に手間ですが,出力結果を転置する処理を後に追加する必要があります.その際には,apply関数全体をt()という関数で囲うのが最もシンプルな方法です.元の行列の第3行の行和は100ですが,確かに第3行の各要素は1/100されていることがわかります.

t(apply(X=nummat,MARGIN=1,FUN=function(x){
  m <- x/sum(x)
  return(m)
}))
##           [,1]      [,2]     [,3]
## [1,] 0.1111111 0.4365079 0.452381
## [2,] 0.5228758 0.2287582 0.248366
## [3,] 0.4300000 0.2400000 0.330000
#元の行列
nummat
##      [,1] [,2] [,3]
## [1,]   14   55   57
## [2,]   80   35   38
## [3,]   43   24   33

lapply

 lapply関数は,リスト・ベクトルに対して,行方向もしくは列方向に関数を適用します.第1引数Xには演算を適用するリスト・ベクトルを指定します.第2引数FUNには,適用したい関数を指定します.まずは,既存関数をFUNの引数としたlapply関数の実行例を示します.

#リストの各要素の和をリスト形式で返す
lapply(X=numlist,FUN=sum)
## $x
## [1] 15
## 
## $y
## [1] 105
## 
## $z
## [1] 90
#ベクトルの各要素の平方根をリスト形式で返す
lapply(X=numvec,FUN=sqrt)
## [[1]]
## [1] 3.741657
## 
## [[2]]
## [1] 8.944272
## 
## [[3]]
## [1] 6.557439
## 
## [[4]]
## [1] 7.416198
## 
## [[5]]
## [1] 5.91608
## 
## [[6]]
## [1] 4.898979
## 
## [[7]]
## [1] 7.549834
## 
## [[8]]
## [1] 6.164414
## 
## [[9]]
## [1] 5.744563

次に,自作関数をFUNの引数としたlapply関数の実行例を示します.functionの引数となるxは,第1引数Xに指定されたリスト・ベクトルの各要素です.

#リストの各要素の和をリスト形式で返す
lapply(X=numlist,FUN=function(x){
  #リストの要素を二乗する
  m <- x^2
  #結果を返す
  return(m)
})
## $x
## [1]  1  4  9 16 25
## 
## $y
##  [1]  36  49  64  81 100 121 144 169 196 225
## 
## $z
## [1] 256 289 324 361 400
#ベクトルの各要素から新たなベクトルを作成し,リスト形式で返す
lapply(X=numvec,FUN=function(x){
  #ベクトルの要素:(ベクトルの要素+2)なる数値ベクトルを作成
  m <- x:(x+2)
  #結果を返す
  return(m)
})
## [[1]]
## [1] 14 15 16
## 
## [[2]]
## [1] 80 81 82
## 
## [[3]]
## [1] 43 44 45
## 
## [[4]]
## [1] 55 56 57
## 
## [[5]]
## [1] 35 36 37
## 
## [[6]]
## [1] 24 25 26
## 
## [[7]]
## [1] 57 58 59
## 
## [[8]]
## [1] 38 39 40
## 
## [[9]]
## [1] 33 34 35

 リストに含まれる全ての要素の長さが同じであれば,リストから行列やデータフレームを作ることできます(numvecに自作関数を適用したケースがそれに該当).その際には,do.callという関数と,rbind関数を組み合わせた以下のコードを実行すれば良いです.do.call関数の第1引数whatは適用したい関数(今回はrbind関数),第2引数argsは関数が適用されるリストです.今回はリスト内の要素がベクトルなので,実行結果は行列で返ってきます.

#リストの要素を行方向に結合する
do.call(what=rbind,
        args=lapply(X=numvec,FUN=function(x){
          m <- x:(x+2)
          return(m)
          }))
##       [,1] [,2] [,3]
##  [1,]   14   15   16
##  [2,]   80   81   82
##  [3,]   43   44   45
##  [4,]   55   56   57
##  [5,]   35   36   37
##  [6,]   24   25   26
##  [7,]   57   58   59
##  [8,]   38   39   40
##  [9,]   33   34   35

データフレーム操作

 ここでは,主にdplyrパッケージを用いたデータフレームの操作方法を解説します.

パッケージのインストール・読み込み

 dplyrを始めとする外部パッケージを用いる際には,そのインストールと読み込みが必要となります.同じPCを使う場合には,パッケージのインストールは一度行えば良いのですが,読み込みはRを起動するたびに毎回行う必要があります.
 このチュートリアルで用いるパッケージはdplyrとopenxlsxの2つです.dplyrについては,tidyverseパッケージという,データハンドリングに用いられる各種パッケージ群をまとめて管理できるパッケージの一部として,インストール・読み込みを行います.
 パッケージのインストールは,install.packages関数を用いて行います.なお,このチュートリアルの筆者のPCにはこれら2つのパッケージはインストール済みなので,Rmd実行の都合上,コメント化しています.

# #tidyverseパッケージをインストール
# install.packages("tidyverse")
# #openxlsxパッケージをインストール
# install.packages("openxlsx")

インストールしたパッケージは,library関数を用いて読み込みます.

#tidyverseパッケージを読み込み
library(tidyverse)
#openxlsxパッケージを読み込み
library(openxlsx)

データの読み込み

 今回の演習で用いるデータは,以下の2つです.

  • fuk_p_lonlat:OpenStreetMapから取得された,福岡市内の店舗のリストに位置情報を付与したテーブル.csv形式とxlsx形式の2つを用意.
  • osm_shop_desc:OpenStreetMapから取得されるデータの属性に関するテーブル.

店舗テーブルの読み込み

 csv形式のデータの読み込みには,read.csv関数を用います.引数fileにはファイル名を指定します.このRmdと同じディレクトリにファイルが置かれている場合には,ファイル名のみを指定すれば良いのですが,別のディレクトリに置かれている場合は,以下のいずれかの方法を取る必要があります.

  • setwd関数を用いてファイルが置かれているディレクトリに移動する.
  • ファイル名をフルパスで指定する.

 stringsAsFactorsは,文字列変数を読み込んだ際に因子型に変換するかを指定する引数です.今回は因子型の変数を扱わないので,FALSEにします. fileEncodingは,読み込むファイルの文字コードを指定する引数です.誤った文字コードを指定すると,読み込んだファイルが文字化けを起こすので,注意が必要です.日本語ファイルの場合,Windows環境下で作成された場合は文字コードはCP932(もしくはShift_JIS),Mac環境下で作成された場合はUTF-8になる場合が多いです.例えばCP932を指定して文字化けが起きた場合には,UTF-8を指定すると文字化けが解消する可能性があります.

shop_fuk <- read.csv(file="fuk_p_lonlat.csv",
                     #文字列を因子型にしない
                     stringsAsFactors=FALSE,
                     #ファイルの文字コードはUTF-8
                     fileEncoding="UTF-8")

 csv形式のファイルはサイズを小さくできる反面,csv形式への変換を行う過程でデータが含んでいた情報が失われたり,破損したりする可能性があるという欠点があります.故に,サイズの制約等が特になければ,ファイルの読み込み・書き出しにはcsv形式よりもxlsx形式を使う方が便利である場合も多いです.
 xlsx形式のデータの読み込みには,openxlsxパッケージのread.xlsx関数を用います.引数xlsxFileにはファイル名を,sheetにはシート名を指定します.関数名に,「openxlsx::」という風にパッケージ名を明示していますが,これは異なるパッケージ間での関数名の衝突を避ける為の記述です.

shop_fuk <- openxlsx::read.xlsx(xlsxFile="fuk_p_lonlat.xlsx",
                                sheet="Sheet 1")
#データの先頭行を表示
head(shop_fuk,20)
##       osm_id                          name        shop KEN_NAME GST_NAME
## 1  312503423                マリノアシティ        mall   福岡県   福岡市
## 2  473575921                      ローソン convenience   福岡県   福岡市
## 3  477366418                  ミニストップ convenience   福岡県   福岡市
## 4  485707416                      BOX TOWN         yes   福岡県   福岡市
## 5  485707433                ゆめタウン博多 supermarket   福岡県   福岡市
## 6  495981699                        サニー supermarket   福岡県   福岡市
## 7  495989488                    マルショク supermarket   福岡県   福岡市
## 8  502929378                  ビックカメラ electronics   福岡県   福岡市
## 9  503886006                          Muse select shop   福岡県   福岡市
## 10 506232942              ファミリーマート convenience   福岡県   福岡市
## 11 506232961               セブン-イレブン convenience   福岡県   福岡市
## 12 510163207 ドン・キホーテ 楽市街道箱崎店 supermarket   福岡県   福岡市
## 13 510163208                    明林堂書店       books   福岡県   福岡市
## 14 534037962                    マルショク supermarket   福岡県   福岡市
## 15 534043691          マウスコンピューター    computer   福岡県   福岡市
## 16 574367792                福岡リバレイン supermarket   福岡県   福岡市
## 17 598037000                    エブリワン convenience   福岡県   福岡市
## 18 685104775                  ミニストップ convenience     <NA>     <NA>
## 19 692545057                  サニー宝町店 supermarket     <NA>     <NA>
## 20 692599229                  絆 理美容店 hairdresser     <NA>     <NA>
##    CSS_NAME           MOJI      lon      lat
## 1      西区     小戸2丁目 130.3226 33.59501
## 2    博多区 博多駅東2丁目 130.4237 33.58691
## 3      東区     大岳1丁目 130.3446 33.65198
## 4      東区     箱崎4丁目 130.4168 33.61967
## 5      東区     東浜1丁目 130.4120 33.61187
## 6    博多区 博多駅南3丁目 130.4264 33.58202
## 7    博多区 博多駅南2丁目 130.4241 33.58231
## 8    中央区     天神2丁目 130.3987 33.58757
## 9    中央区     大名1丁目 130.3943 33.58597
## 10   博多区 博多駅南3丁目 130.4257 33.58254
## 11   博多区 博多駅南1丁目 130.4244 33.58598
## 12     東区     箱崎5丁目 130.4196 33.62406
## 13     東区     箱崎4丁目 130.4192 33.62255
## 14   博多区     千代3丁目 130.4121 33.60167
## 15   博多区 博多駅南1丁目 130.4221 33.58707
## 16   博多区       下川端町 130.4056 33.59533
## 17   博多区     竹下5丁目 130.4342 33.56952
## 18     <NA>           <NA> 130.4449 33.52191
## 19     <NA>           <NA> 130.4577 33.53356
## 20     <NA>           <NA> 130.4571 33.51886

shop_fukの変数の定義は以下の通りです.

  • osm_id:OSM内でのオブジェクトID
  • name:店舗名
  • shop:店舗分類(分類の詳細は,OpenStreetMap Wikiで確認可能)
  • KEN_NAME:都道府県名
  • GST_NAME:市区町村名
  • CSS_NAME:区名
  • MOJI:小地域名
  • lon:経度
  • lat:緯度

OSM属性テーブルの読み込み

 同じ要領で,OSM属性テーブルのxlsxを読み込みます.osm_shop_descの変数の定義は以下の通りです.

  • Key:OSM内での店舗オブジェクトを表すキー
  • Value:店舗分類(shop_fuk内の変数shopと定義は同じ)
  • Category:店舗分類の上位の分類
  • Comment:店舗分類の詳細
osm_shop_desc <- openxlsx::read.xlsx(xlsxFile="osm_shop_desc.xlsx",
                                     sheet="Sheet1")
#データの先頭行を表示
head(osm_shop_desc,20)
##     Key            Value        Category
## 1  shop          alcohol Food, beverages
## 2  shop           bakery Food, beverages
## 3  shop        beverages Food, beverages
## 4  shop brewing_supplies Food, beverages
## 5  shop          butcher Food, beverages
## 6  shop           cheese Food, beverages
## 7  shop        chocolate Food, beverages
## 8  shop           coffee Food, beverages
## 9  shop    confectionery Food, beverages
## 10 shop      convenience Food, beverages
## 11 shop             deli Food, beverages
## 12 shop            dairy Food, beverages
## 13 shop             farm Food, beverages
## 14 shop      frozen_food Food, beverages
## 15 shop      greengrocer Food, beverages
## 16 shop      health_food Food, beverages
## 17 shop        ice_cream Food, beverages
## 18 shop          organic Food, beverages
## 19 shop            pasta Food, beverages
## 20 shop           pastry Food, beverages
##                                                                                                                                                                                        Comment
## 1                                                                                                                                                            Shop selling alcohol to take away
## 2                                                                                                                                                                Shop focused on selling bread
## 3                                                                                                        Shop focused on selling alcoholic and non-alcoholic beverages. See also shop=alcohol.
## 4                                                                                               Shop focused on selling supplies for home brewing of beer, wine and spirits (where permitted).
## 5                                                                                                                                                                 Shop focused on selling meat
## 6                                                                                                                                                              Shop focused on selling cheese.
## 7                                                                                                                                                           Shop focused on selling chocolate.
## 8                                                                                                                                                              Shop focused on selling coffee.
## 9                                                                                                                                                      Shop focused on selling sweets or candy
## 10                                                                                                     A small local shop carrying a small subset of the items you would find in a supermarket
## 11                                                            Shop focused on selling delicatessen (fine foods, gourmet foods), possibly also fine wine. Not to be confused with the US delis.
## 12                                                                                                                                                     Shop focused on selling dairy products.
## 13                                                                                                                    Shop or roadside stand focused on selling freshly harvested farm produce
## 14                                                                                                                                                        Shop focused on selling frozen food.
## 15                                                                                                                                              Shop focused on selling vegetables and fruits.
## 16                                                                                    A health food shop; selling wholefoods, vitamins, nutrition supplements and meat and dairy alternatives.
## 17                                                                                                                                         Shop selling ice cream. See also amenity=ice_cream.
## 18 Shop focused on selling organic food. Alternatively you can use the more versatile organic=* in combination with a general shop=* key (In this case: shop=supermarket or shop=convenience).
## 19                                                                                                                                        Shop focused on selling (fresh) pasta, ravioli, etc.
## 20                                                                                                                Shop focused on selling baked sweets like cakes, biscuits, strudel and pies.

行の操作

条件式の評価に合う行の抽出・パイプ演算子

 条件式に応じてデータから行の一部を取り出す際には,dplyrパッケージのfilter関数を用います.filter関数の抽出条件として使えるものの例として,データ内の変数名をvalue,何かしらの値をAとすれば,以下のものが挙げられます.

  • value<A:Aより小さい
  • value>A:Aより大きい
  • value==A:Aに等しい
  • value<=A:A以下
  • value>=A:A以上
  • value!=A:Aと等しくない
  • value%in%A:Aという集合に含まれる
  • is.na(value):欠損値である
  • !is.na(value):欠損値ではない
  • 条件1&条件2:条件1と条件2を両方満たす
  • 条件1|条件2:条件1と条件2の少なくとも片方を満たす

 手始めとして,住所情報がNAではないレコードのみを抽出します.例えば,小地域名の変数MOJIがNAでないものを抽出します(MOJIがNAでなければ,KEN_NAME等の上位階層の住所変数もNAではないので).その前に,抽出前のレコード数を示します.

#抽出前のレコード数
dim(shop_fuk)
## [1] 2704    9

 変数MOJIがNAでないレコードを抽出する為のコードは以下のようになります.「%>%」はパイプ演算子と呼ばれるもので,左辺のオブジェクトを右辺関数の第1引数として渡す役割を持ちます.例えば,

  • x %>% f → f(x)
  • x %>% f(y) → f(x,y)
  • x %>% f %>% g %>% h → h(g(f(x)))
  • x %>% f(y,.) → f(y,x)
  • x %>% f(y=nrow(.),z=ncol(.)) → f(x,y=nrow(x),z=ncol(x))
  • x %>% {f(y=nrow(.),z=ncol(.))} → f(y=nrow(x),z=ncol(x))

抽出後のレコードを確認すると,変数MOJIがNAだったレコードが削除され,レコード数が減少したことがわかります.

shop_fuk <- shop_fuk %>%
  #変数MOJIがNAでないものを抽出
  dplyr::filter(!is.na(MOJI))
#抽出後のレコード数
dim(shop_fuk)
## [1] 2176    9
#データの先頭行
head(shop_fuk,20)
##       osm_id                          name         shop KEN_NAME GST_NAME
## 1  312503423                マリノアシティ         mall   福岡県   福岡市
## 2  473575921                      ローソン  convenience   福岡県   福岡市
## 3  477366418                  ミニストップ  convenience   福岡県   福岡市
## 4  485707416                      BOX TOWN          yes   福岡県   福岡市
## 5  485707433                ゆめタウン博多  supermarket   福岡県   福岡市
## 6  495981699                        サニー  supermarket   福岡県   福岡市
## 7  495989488                    マルショク  supermarket   福岡県   福岡市
## 8  502929378                  ビックカメラ  electronics   福岡県   福岡市
## 9  503886006                          Muse  select shop   福岡県   福岡市
## 10 506232942              ファミリーマート  convenience   福岡県   福岡市
## 11 506232961               セブン-イレブン  convenience   福岡県   福岡市
## 12 510163207 ドン・キホーテ 楽市街道箱崎店  supermarket   福岡県   福岡市
## 13 510163208                    明林堂書店        books   福岡県   福岡市
## 14 534037962                    マルショク  supermarket   福岡県   福岡市
## 15 534043691          マウスコンピューター     computer   福岡県   福岡市
## 16 574367792                福岡リバレイン  supermarket   福岡県   福岡市
## 17 598037000                    エブリワン  convenience   福岡県   福岡市
## 18 697340563                      グッデイ doityourself   福岡県   福岡市
## 19 704397098          マルキョウ・ヤマダイ  supermarket   福岡県   福岡市
## 20 705059464                    マルキョウ  supermarket   福岡県   福岡市
##    CSS_NAME           MOJI      lon      lat
## 1      西区     小戸2丁目 130.3226 33.59501
## 2    博多区 博多駅東2丁目 130.4237 33.58691
## 3      東区     大岳1丁目 130.3446 33.65198
## 4      東区     箱崎4丁目 130.4168 33.61967
## 5      東区     東浜1丁目 130.4120 33.61187
## 6    博多区 博多駅南3丁目 130.4264 33.58202
## 7    博多区 博多駅南2丁目 130.4241 33.58231
## 8    中央区     天神2丁目 130.3987 33.58757
## 9    中央区     大名1丁目 130.3943 33.58597
## 10   博多区 博多駅南3丁目 130.4257 33.58254
## 11   博多区 博多駅南1丁目 130.4244 33.58598
## 12     東区     箱崎5丁目 130.4196 33.62406
## 13     東区     箱崎4丁目 130.4192 33.62255
## 14   博多区     千代3丁目 130.4121 33.60167
## 15   博多区 博多駅南1丁目 130.4221 33.58707
## 16   博多区       下川端町 130.4056 33.59533
## 17   博多区     竹下5丁目 130.4342 33.56952
## 18     南区     曰佐2丁目 130.4395 33.54001
## 19     南区   警弥郷1丁目 130.4311 33.53251
## 20     南区     的場2丁目 130.4340 33.54281

 ここから,いくつかの抽出の例を示します.なお,今回は抽出した結果をオブジェクトに代入しないため,以下の抽出作業を行っても,shop_fukの内容は変化しません.

#区名CSS_NAMEが「博多区」に等しいものを抽出
shop_fuk %>%
  dplyr::filter(CSS_NAME=="博多区") %>%
  #先頭20行を表示
  head(20)
##        osm_id                  name        shop KEN_NAME GST_NAME CSS_NAME
## 1   473575921              ローソン convenience   福岡県   福岡市   博多区
## 2   495981699                サニー supermarket   福岡県   福岡市   博多区
## 3   495989488            マルショク supermarket   福岡県   福岡市   博多区
## 4   506232942      ファミリーマート convenience   福岡県   福岡市   博多区
## 5   506232961       セブン-イレブン convenience   福岡県   福岡市   博多区
## 6   534037962            マルショク supermarket   福岡県   福岡市   博多区
## 7   534043691  マウスコンピューター    computer   福岡県   福岡市   博多区
## 8   574367792        福岡リバレイン supermarket   福岡県   福岡市   博多区
## 9   598037000            エブリワン convenience   福岡県   福岡市   博多区
## 10  777572999       セブン-イレブン convenience   福岡県   福岡市   博多区
## 11  777609416       セブン-イレブン convenience   福岡県   福岡市   博多区
## 12  791470783       セブン-イレブン convenience   福岡県   福岡市   博多区
## 13  791470792              ローソン convenience   福岡県   福岡市   博多区
## 14  792896158              ローソン convenience   福岡県   福岡市   博多区
## 15  792896186              ローソン convenience   福岡県   福岡市   博多区
## 16  792896296       セブン-イレブン convenience   福岡県   福岡市   博多区
## 17  811121376 honda cars 福岡板付店         car   福岡県   福岡市   博多区
## 18  953306165      ファミリーマート convenience   福岡県   福岡市   博多区
## 19 1030390497      デイリーヤマザキ convenience   福岡県   福岡市   博多区
## 20 1030391640              サンクス convenience   福岡県   福岡市   博多区
##              MOJI      lon      lat
## 1  博多駅東2丁目 130.4237 33.58691
## 2  博多駅南3丁目 130.4264 33.58202
## 3  博多駅南2丁目 130.4241 33.58231
## 4  博多駅南3丁目 130.4257 33.58254
## 5  博多駅南1丁目 130.4244 33.58598
## 6      千代3丁目 130.4121 33.60167
## 7  博多駅南1丁目 130.4221 33.58707
## 8        下川端町 130.4056 33.59533
## 9      竹下5丁目 130.4342 33.56952
## 10   西月隈3丁目 130.4519 33.56981
## 11     諸岡2丁目 130.4487 33.56020
## 12   相生町2丁目 130.4591 33.54456
## 13     諸岡5丁目 130.4517 33.55675
## 14   博多駅中央街 130.4222 33.59060
## 15 博多駅前1丁目 130.4201 33.59227
## 16 博多駅南2丁目 130.4223 33.58111
## 17     板付5丁目 130.4567 33.56402
## 18         冷泉町 130.4130 33.59355
## 19 博多駅東1丁目 130.4234 33.59146
## 20 博多駅東1丁目 130.4227 33.59164
#区名CSS_NAMEが「博多区」もしくは「中央区」に等しいものを抽出
#書き方1
shop_fuk %>%
  dplyr::filter(CSS_NAME=="博多区"|CSS_NAME=="中央区") %>%
  #先頭20行を表示
  head(20)
##       osm_id                 name        shop KEN_NAME GST_NAME CSS_NAME
## 1  473575921             ローソン convenience   福岡県   福岡市   博多区
## 2  495981699               サニー supermarket   福岡県   福岡市   博多区
## 3  495989488           マルショク supermarket   福岡県   福岡市   博多区
## 4  502929378         ビックカメラ electronics   福岡県   福岡市   中央区
## 5  503886006                 Muse select shop   福岡県   福岡市   中央区
## 6  506232942     ファミリーマート convenience   福岡県   福岡市   博多区
## 7  506232961      セブン-イレブン convenience   福岡県   福岡市   博多区
## 8  534037962           マルショク supermarket   福岡県   福岡市   博多区
## 9  534043691 マウスコンピューター    computer   福岡県   福岡市   博多区
## 10 574367792       福岡リバレイン supermarket   福岡県   福岡市   博多区
## 11 598037000           エブリワン convenience   福岡県   福岡市   博多区
## 12 748630354     ファミリーマート convenience   福岡県   福岡市   中央区
## 13 761915472             ローソン convenience   福岡県   福岡市   中央区
## 14 763018804             ローソン convenience   福岡県   福岡市   中央区
## 15 767170634      セブン-イレブン convenience   福岡県   福岡市   中央区
## 16 767170635     ファミリーマート convenience   福岡県   福岡市   中央区
## 17 777572999      セブン-イレブン convenience   福岡県   福岡市   博多区
## 18 777609416      セブン-イレブン convenience   福岡県   福岡市   博多区
## 19 791470783      セブン-イレブン convenience   福岡県   福岡市   博多区
## 20 791470792             ローソン convenience   福岡県   福岡市   博多区
##              MOJI      lon      lat
## 1  博多駅東2丁目 130.4237 33.58691
## 2  博多駅南3丁目 130.4264 33.58202
## 3  博多駅南2丁目 130.4241 33.58231
## 4      天神2丁目 130.3987 33.58757
## 5      大名1丁目 130.3943 33.58597
## 6  博多駅南3丁目 130.4257 33.58254
## 7  博多駅南1丁目 130.4244 33.58598
## 8      千代3丁目 130.4121 33.60167
## 9  博多駅南1丁目 130.4221 33.58707
## 10       下川端町 130.4056 33.59533
## 11     竹下5丁目 130.4342 33.56952
## 12     舞鶴2丁目 130.3927 33.59091
## 13     大名2丁目 130.3928 33.59052
## 14     天神3丁目 130.3961 33.59181
## 15     天神3丁目 130.3976 33.59369
## 16     天神3丁目 130.3954 33.59234
## 17   西月隈3丁目 130.4519 33.56981
## 18     諸岡2丁目 130.4487 33.56020
## 19   相生町2丁目 130.4591 33.54456
## 20     諸岡5丁目 130.4517 33.55675
#書き方2
shop_fuk %>%
  dplyr::filter(CSS_NAME%in%c("博多区","中央区")) %>%
  #先頭20行を表示
  head(20)
##       osm_id                 name        shop KEN_NAME GST_NAME CSS_NAME
## 1  473575921             ローソン convenience   福岡県   福岡市   博多区
## 2  495981699               サニー supermarket   福岡県   福岡市   博多区
## 3  495989488           マルショク supermarket   福岡県   福岡市   博多区
## 4  502929378         ビックカメラ electronics   福岡県   福岡市   中央区
## 5  503886006                 Muse select shop   福岡県   福岡市   中央区
## 6  506232942     ファミリーマート convenience   福岡県   福岡市   博多区
## 7  506232961      セブン-イレブン convenience   福岡県   福岡市   博多区
## 8  534037962           マルショク supermarket   福岡県   福岡市   博多区
## 9  534043691 マウスコンピューター    computer   福岡県   福岡市   博多区
## 10 574367792       福岡リバレイン supermarket   福岡県   福岡市   博多区
## 11 598037000           エブリワン convenience   福岡県   福岡市   博多区
## 12 748630354     ファミリーマート convenience   福岡県   福岡市   中央区
## 13 761915472             ローソン convenience   福岡県   福岡市   中央区
## 14 763018804             ローソン convenience   福岡県   福岡市   中央区
## 15 767170634      セブン-イレブン convenience   福岡県   福岡市   中央区
## 16 767170635     ファミリーマート convenience   福岡県   福岡市   中央区
## 17 777572999      セブン-イレブン convenience   福岡県   福岡市   博多区
## 18 777609416      セブン-イレブン convenience   福岡県   福岡市   博多区
## 19 791470783      セブン-イレブン convenience   福岡県   福岡市   博多区
## 20 791470792             ローソン convenience   福岡県   福岡市   博多区
##              MOJI      lon      lat
## 1  博多駅東2丁目 130.4237 33.58691
## 2  博多駅南3丁目 130.4264 33.58202
## 3  博多駅南2丁目 130.4241 33.58231
## 4      天神2丁目 130.3987 33.58757
## 5      大名1丁目 130.3943 33.58597
## 6  博多駅南3丁目 130.4257 33.58254
## 7  博多駅南1丁目 130.4244 33.58598
## 8      千代3丁目 130.4121 33.60167
## 9  博多駅南1丁目 130.4221 33.58707
## 10       下川端町 130.4056 33.59533
## 11     竹下5丁目 130.4342 33.56952
## 12     舞鶴2丁目 130.3927 33.59091
## 13     大名2丁目 130.3928 33.59052
## 14     天神3丁目 130.3961 33.59181
## 15     天神3丁目 130.3976 33.59369
## 16     天神3丁目 130.3954 33.59234
## 17   西月隈3丁目 130.4519 33.56981
## 18     諸岡2丁目 130.4487 33.56020
## 19   相生町2丁目 130.4591 33.54456
## 20     諸岡5丁目 130.4517 33.55675
#区名CSS_NAMEが「博多区」かつ店舗分類shopがsupermarket
shop_fuk %>%
  dplyr::filter(CSS_NAME=="博多区"&shop=="supermarket") %>%
  #先頭20行を表示
  head(20)
##        osm_id                       name        shop KEN_NAME GST_NAME CSS_NAME
## 1   495981699                     サニー supermarket   福岡県   福岡市   博多区
## 2   495989488                 マルショク supermarket   福岡県   福岡市   博多区
## 3   534037962                 マルショク supermarket   福岡県   福岡市   博多区
## 4   574367792             福岡リバレイン supermarket   福岡県   福岡市   博多区
## 5  4229270607                       <NA> supermarket   福岡県   福岡市   博多区
## 6  4428943991   ニューヨークストア住吉店 supermarket   福岡県   福岡市   博多区
## 7  5108491822                 マルキョー supermarket   福岡県   福岡市   博多区
## 8  5109721022             マックスバリュ supermarket   福岡県   福岡市   博多区
## 9  5411676621                     サニー supermarket   福岡県   福岡市   博多区
## 10 5495570221                    MaxValu supermarket   福岡県   福岡市   博多区
## 11 5694028238 マックスバリュエクスプレス supermarket   福岡県   福岡市   博多区
## 12 5935614863                     サニー supermarket   福岡県   福岡市   博多区
## 13 5935619265                       <NA> supermarket   福岡県   福岡市   博多区
## 14 5957741486                      SUNNY supermarket   福岡県   福岡市   博多区
## 15 5970753585               A−プライス supermarket   福岡県   福岡市   博多区
## 16 6006932088                       <NA> supermarket   福岡県   福岡市   博多区
## 17 6817611285      ルミエール;ルミエ-ル supermarket   福岡県   福岡市   博多区
## 18 6817772585               業務スーパー supermarket   福岡県   福岡市   博多区
## 19 7011021586                       <NA> supermarket   福岡県   福岡市   博多区
## 20 7345598613           マルキョウ板付店 supermarket   福岡県   福岡市   博多区
##              MOJI      lon      lat
## 1  博多駅南3丁目 130.4264 33.58202
## 2  博多駅南2丁目 130.4241 33.58231
## 3      千代3丁目 130.4121 33.60167
## 4        下川端町 130.4056 33.59533
## 5        上呉服町 130.4100 33.59789
## 6      住吉4丁目 130.4154 33.58421
## 7    銀天町1丁目 130.4627 33.54639
## 8    竹丘町3丁目 130.4651 33.54539
## 9    東比恵2丁目 130.4301 33.58970
## 10         祇園町 130.4107 33.59204
## 11     寿町2丁目 130.4610 33.54187
## 12   美野島3丁目 130.4196 33.57639
## 13   美野島2丁目 130.4191 33.57913
## 14       吉塚本町 130.4231 33.60719
## 15     竹下4丁目 130.4331 33.56968
## 16   美野島2丁目 130.4175 33.58005
## 17   東那珂1丁目 130.4396 33.57418
## 18     千代3丁目 130.4123 33.60314
## 19       上川端町 130.4065 33.59479
## 20     板付2丁目 130.4513 33.56431

重複行を削除

 いくつかの変数をキーとして,重複行を削除する際には,dplyrパッケージのdistinct関数を用います.例えば,都道府県名KEN_NAME,市区町村名GST_NAME,区名CSS_NAMEをキーとして重複を削除する為のコードは以下のようになります.

shop_fuk %>%
  #都道府県名KEN_NAME,市区町村名GST_NAME,区名CSS_NAMEをキーとして重複を削除
  dplyr::distinct(KEN_NAME,GST_NAME,CSS_NAME)
##   KEN_NAME GST_NAME CSS_NAME
## 1   福岡県   福岡市     西区
## 2   福岡県   福岡市   博多区
## 3   福岡県   福岡市     東区
## 4   福岡県   福岡市   中央区
## 5   福岡県   福岡市     南区
## 6   福岡県   福岡市   城南区
## 7   福岡県   福岡市   早良区

行の並び替え

 いくつかの変数をキーとして,データの順番を並び替える際には,dplyrパッケージのarrange関数を用います.例えば,店舗分類shopをキーとしてデータを並び替える為のコードは以下のようになります.

shop_fuk %>%
  #店舗分類shopをキーとして昇順で並び替え
  dplyr::arrange(shop) %>%
  #先頭20行を表示
  head(20)
##        osm_id               name          shop KEN_NAME GST_NAME CSS_NAME
## 1  4730050316           ダイソー 100円ショップ   福岡県   福岡市   早良区
## 2  2580372361         小田部酒店       alcohol   福岡県   福岡市   早良区
## 3  3781519744 かごしま文化邑酒店       alcohol   福岡県   福岡市   博多区
## 4  4901354055             やまや       alcohol   福岡県   福岡市     南区
## 5  6174822988               <NA>       alcohol   福岡県   福岡市   中央区
## 6  6189513106         さかや酒店       alcohol   福岡県   福岡市     東区
## 7  6601851746           牛尾酒店       alcohol   福岡県   福岡市   早良区
## 8  6619800469             やまや       alcohol   福岡県   福岡市     西区
## 9   502803840               <NA>       alcohol   福岡県   福岡市   博多区
## 10  603545064               <NA>       alcohol   福岡県   福岡市     南区
## 11  661058213           許斐酒店       alcohol   福岡県   福岡市     東区
## 12  661639237           丸允酒店       alcohol   福岡県   福岡市     東区
## 13  664034645           安武酒店       alcohol   福岡県   福岡市     東区
## 14  700124095     トライアングル       alcohol   福岡県   福岡市   早良区
## 15  714379677             Re-Lax       alcohol   福岡県   福岡市   城南区
## 16  714379694       ほしくま酒店       alcohol   福岡県   福岡市   城南区
## 17  715051847           伊佐酒店       alcohol   福岡県   福岡市   早良区
## 18  998513732         酒のやまや       alcohol   福岡県   福岡市   中央区
## 19 1044263578           石橋酒店       alcohol   福岡県   福岡市   城南区
## 20 6956891867         まんだらけ         anime   福岡県   福岡市   中央区
##            MOJI      lon      lat
## 1  小田部5丁目 130.3317 33.56853
## 2    西新4丁目 130.3587 33.58283
## 3    中州5丁目 130.4054 33.59403
## 4    大楠1丁目 130.4140 33.57366
## 5    大名2丁目 130.3955 33.58848
## 6    筥松4丁目 130.4276 33.62925
## 7    四箇2丁目 130.3248 33.53089
## 8    今宿3丁目 130.2655 33.58160
## 9    三筑2丁目 130.4557 33.55016
## 10   柳瀬1丁目 130.4373 33.53246
## 11   箱崎6丁目 130.4214 33.62406
## 12   箱崎1丁目 130.4262 33.61680
## 13   箱崎2丁目 130.4213 33.61897
## 14 次郎丸3丁目 130.3266 33.54823
## 15   片江3丁目 130.3738 33.55199
## 16   干隈1丁目 130.3523 33.55406
## 17 小田部4丁目 130.3290 33.56635
## 18   長浜2丁目 130.3880 33.59297
## 19     堤1丁目 130.3805 33.54450
## 20   大名2丁目 130.3939 33.59004
shop_fuk %>%
  #店舗分類shopをキーとして降順で並び替え
  dplyr::arrange(desc(shop)) %>%
  #先頭20行を表示
  head(20)
##        osm_id                   name            shop KEN_NAME GST_NAME CSS_NAME
## 1   262902787                   <NA> 楽市街道 箱崎店   福岡県   福岡市     東区
## 2   485707416               BOX TOWN             yes   福岡県   福岡市     東区
## 3  1010255858                   <NA>             yes   福岡県   福岡市     西区
## 4  4852895794 Laps - la pet supplies             yes   福岡県   福岡市     南区
## 5  6202491589                 林商店             yes   福岡県   福岡市     東区
## 6  6202699556         おはぎ・おこわ             yes   福岡県   福岡市     東区
## 7  6243429877               神田商店             yes   福岡県   福岡市     東区
## 8  6245799865                 公文式             yes   福岡県   福岡市     東区
## 9  6248764521   ハコザキ電化センター             yes   福岡県   福岡市     東区
## 10 6248888814   九大進学ゼミ 箱崎校             yes   福岡県   福岡市     東区
## 11 6257892015                 アコム             yes   福岡県   福岡市     東区
## 12 6257892021               アイフル             yes   福岡県   福岡市     東区
## 13 6261075592           共栄理化器店             yes   福岡県   福岡市     東区
## 14 6261075593     ヤオキ理工株式会社             yes   福岡県   福岡市     東区
## 15 6336911922                 ふくや             yes   福岡県   福岡市     東区
## 16 6579386065                kinko's             yes   福岡県   福岡市   中央区
## 17 6816556568             米のます屋             yes   福岡県   福岡市   早良区
## 18 7893036499           花畑マルシェ             yes   福岡県   福岡市     南区
## 19 8918619602                 INCUBE             yes   福岡県   福岡市     西区
## 20 8918619608       はしもとまるしぇ             yes   福岡県   福岡市     西区
##          MOJI      lon      lat
## 1  箱崎5丁目 130.4194 33.62418
## 2  箱崎4丁目 130.4168 33.61967
## 3  西都1丁目 130.2595 33.58091
## 4  野間3丁目 130.4128 33.56036
## 5  箱崎1丁目 130.4241 33.61853
## 6  箱崎1丁目 130.4230 33.61658
## 7  東浜1丁目 130.4137 33.61683
## 8  松島1丁目 130.4323 33.62604
## 9  筥松1丁目 130.4317 33.61652
## 10 原田2丁目 130.4318 33.61910
## 11 松島3丁目 130.4394 33.62495
## 12 松島3丁目 130.4392 33.62510
## 13 筥松1丁目 130.4324 33.61574
## 14 筥松1丁目 130.4324 33.61578
## 15 下原4丁目 130.4506 33.67238
## 16 天神2丁目 130.3978 33.59063
## 17 四箇2丁目 130.3254 33.53155
## 18   大字檜原 130.3865 33.52575
## 19 橋本2丁目 130.3213 33.55615
## 20 橋本2丁目 130.3215 33.55657

また,区名CSS_NAMEで並び替えた後に店舗分類shopで並び替える際には,以下のようになります.

shop_fuk %>%
  #区名CSS_NAMEで並び替えた後に店舗分類shopで並び替え
  dplyr::arrange(CSS_NAME,shop) %>%
  #先頭20行を表示
  head(20)
##        osm_id                   name       shop KEN_NAME GST_NAME CSS_NAME
## 1   714379677                 Re-Lax    alcohol   福岡県   福岡市   城南区
## 2   714379694           ほしくま酒店    alcohol   福岡県   福岡市   城南区
## 3  1044263578               石橋酒店    alcohol   福岡県   福岡市   城南区
## 4  6765637199             フジノ電機  appliance   福岡県   福岡市   城南区
## 5   720043943       北里トケイデンキ  appliance   福岡県   福岡市   城南区
## 6   715051835                 西松屋 baby_goods   福岡県   福岡市   城南区
## 7  8915271105 ブランジェリーアンジュ     bakery   福岡県   福岡市   城南区
## 8  6758190268                  KAITO    bicycle   福岡県   福岡市   城南区
## 9   714390305                 あさひ    bicycle   福岡県   福岡市   城南区
## 10  717514324                  KAITO    bicycle   福岡県   福岡市   城南区
## 11 5567869958                   <NA>      books   福岡県   福岡市   城南区
## 12 5835473564           金文堂福大店      books   福岡県   福岡市   城南区
## 13 8921521133                TSUTAYA      books   福岡県   福岡市   城南区
## 14  702663647               黒木書店      books   福岡県   福岡市   城南区
## 15 8915284142           サトウ精肉店    butcher   福岡県   福岡市   城南区
## 16 9679493121             久田精肉店    butcher   福岡県   福岡市   城南区
## 17 8915284117         YAMADA DOT CAR        car   福岡県   福岡市   城南区
## 18  714390303           カローラ福岡        car   福岡県   福岡市   城南区
## 19  714390304               ダイハツ        car   福岡県   福岡市   城南区
## 20  717514297       ホンダカーズ福岡        car   福岡県   福岡市   城南区
##            MOJI      lon      lat
## 1    片江3丁目 130.3738 33.55199
## 2    干隈1丁目 130.3523 33.55406
## 3      堤1丁目 130.3805 33.54450
## 4    干隈1丁目 130.3505 33.55449
## 5    干隈1丁目 130.3507 33.55498
## 6    長尾3丁目 130.3875 33.55398
## 7      堤1丁目 130.3807 33.54538
## 8  神松寺3丁目 130.3721 33.55229
## 9    長尾3丁目 130.3871 33.55337
## 10   干隈1丁目 130.3516 33.55424
## 11   干隈2丁目 130.3484 33.54962
## 12   七隈8丁目 130.3648 33.54734
## 13 神松寺2丁目 130.3786 33.55574
## 14   七隈8丁目 130.3627 33.55255
## 15 樋井川1丁目 130.3815 33.54802
## 16 東油山2丁目 130.3799 33.53932
## 17     堤1丁目 130.3802 33.54677
## 18   長尾4丁目 130.3839 33.55305
## 19   長尾4丁目 130.3857 33.55322
## 20   干隈2丁目 130.3483 33.54904

列(変数)の操作

条件に応じて列(変数)を抽出

 データフレームから列(変数)の一部を取り出す際には,dplyrパッケージのselect関数を用います.最も基本的なケースとして,ひとつもしくは複数の変数名を指定して取り出す方法を示します.

shop_fuk %>%
  #区名CSS_NAMEのみ取り出し
  dplyr::select(CSS_NAME) %>%
  #先頭行を表示
  head()
##   CSS_NAME
## 1     西区
## 2   博多区
## 3     東区
## 4     東区
## 5     東区
## 6   博多区
shop_fuk %>%
  #区名CSS_NAMEと店舗分類shopのみ取り出し
  dplyr::select(CSS_NAME,shop) %>%
  #先頭行を表示
  head()
##   CSS_NAME        shop
## 1     西区        mall
## 2   博多区 convenience
## 3     東区 convenience
## 4     東区         yes
## 5     東区 supermarket
## 6   博多区 supermarket

 select関数の利点は,様々な条件に応じて列(変数)を抽出できることです.抽出条件として使えるものの例として,以下のものが挙げられます.

  • contains(“match”):「match」という文字列を列名に含む列
  • ends_with(“match”):「match」という文字列で列名が終わる列
  • starts_with(“match”):「match」という文字列で列名が始まる列
  • A:D:列Aから列Dまでの全ての列
  • -A:列A以外の列

これら抽出条件を実行した結果を,順を追って示します.各抽出条件の直前に否定演算子「!」をつければ,その条件に当て「はまらない」列を抽出できます.また,条件を複数組み合わせることもできます.

shop_fuk %>%
  #「osm」という文字列を含む列のみ取り出し
  dplyr::select(dplyr::contains("osm")) %>%
  #先頭行を表示
  head()
##      osm_id
## 1 312503423
## 2 473575921
## 3 477366418
## 4 485707416
## 5 485707433
## 6 495981699
shop_fuk %>%
  #「_NAME」という文字列で終わる列のみ取り出し
  dplyr::select(dplyr::ends_with("_NAME")) %>%
  #先頭行を表示
  head()
##   KEN_NAME GST_NAME CSS_NAME
## 1   福岡県   福岡市     西区
## 2   福岡県   福岡市   博多区
## 3   福岡県   福岡市     東区
## 4   福岡県   福岡市     東区
## 5   福岡県   福岡市     東区
## 6   福岡県   福岡市   博多区
shop_fuk %>%
  #「_NAME」という文字列で終わ「らない」列のみ取り出し
  dplyr::select(!dplyr::ends_with("_NAME")) %>%
  #先頭行を表示
  head()
##      osm_id           name        shop           MOJI      lon      lat
## 1 312503423 マリノアシティ        mall     小戸2丁目 130.3226 33.59501
## 2 473575921       ローソン convenience 博多駅東2丁目 130.4237 33.58691
## 3 477366418   ミニストップ convenience     大岳1丁目 130.3446 33.65198
## 4 485707416       BOX TOWN         yes     箱崎4丁目 130.4168 33.61967
## 5 485707433 ゆめタウン博多 supermarket     東浜1丁目 130.4120 33.61187
## 6 495981699         サニー supermarket 博多駅南3丁目 130.4264 33.58202
shop_fuk %>%
  #「l」という文字列で始まる列のみ取り出し
  dplyr::select(dplyr::starts_with("l")) %>%
  #先頭行を表示
  head()
##        lon      lat
## 1 130.3226 33.59501
## 2 130.4237 33.58691
## 3 130.3446 33.65198
## 4 130.4168 33.61967
## 5 130.4120 33.61187
## 6 130.4264 33.58202
shop_fuk %>%
  #列osm_idから列shopまでの全ての列を取り出し
  dplyr::select(osm_id:shop) %>%
  #先頭行を表示
  head()
##      osm_id           name        shop
## 1 312503423 マリノアシティ        mall
## 2 473575921       ローソン convenience
## 3 477366418   ミニストップ convenience
## 4 485707416       BOX TOWN         yes
## 5 485707433 ゆめタウン博多 supermarket
## 6 495981699         サニー supermarket
shop_fuk %>%
  #列osm_id以外の列を取り出し
  dplyr::select(-osm_id) %>%
  #先頭行を表示
  head()
##             name        shop KEN_NAME GST_NAME CSS_NAME           MOJI      lon
## 1 マリノアシティ        mall   福岡県   福岡市     西区     小戸2丁目 130.3226
## 2       ローソン convenience   福岡県   福岡市   博多区 博多駅東2丁目 130.4237
## 3   ミニストップ convenience   福岡県   福岡市     東区     大岳1丁目 130.3446
## 4       BOX TOWN         yes   福岡県   福岡市     東区     箱崎4丁目 130.4168
## 5 ゆめタウン博多 supermarket   福岡県   福岡市     東区     東浜1丁目 130.4120
## 6         サニー supermarket   福岡県   福岡市   博多区 博多駅南3丁目 130.4264
##        lat
## 1 33.59501
## 2 33.58691
## 3 33.65198
## 4 33.61967
## 5 33.61187
## 6 33.58202
shop_fuk %>%
  #「_NAME」という文字列で終わるが「GST」という文字列では始まらない列のみ取り出し
  dplyr::select(dplyr::ends_with("_NAME")&!dplyr::starts_with("GST")) %>%
  #先頭行を表示
  head()
##   KEN_NAME CSS_NAME
## 1   福岡県     西区
## 2   福岡県   博多区
## 3   福岡県     東区
## 4   福岡県     東区
## 5   福岡県     東区
## 6   福岡県   博多区

抽出された列のベクトル化

 ひとつの変数を取り出し,それを更にベクトル化する方法は主にふた通りあります.ひとつはselect関数を実行した結果にunlist関数を適用してベクトル化する方法,もうひとつはdplyrパッケージのpull関数を実行する方法です.無論,後者の方が手間が少ないです.

#方法1:select&unlist
shop_fuk %>%
  #区名CSS_NAMEのみ取り出し
  dplyr::select(CSS_NAME) %>%
  #ベクトル化
  unlist() %>%
  #先頭行を表示
  head()
## CSS_NAME1 CSS_NAME2 CSS_NAME3 CSS_NAME4 CSS_NAME5 CSS_NAME6 
##    "西区"  "博多区"    "東区"    "東区"    "東区"  "博多区"
#方法2:pull
shop_fuk %>%
  #区名CSS_NAMEのみ取り出してベクトル化
  dplyr::pull(CSS_NAME) %>%
  #先頭行を表示
  head()
## [1] "西区"   "博多区" "東区"   "東区"   "東区"   "博多区"

データの要約

 データフレーム内の数値型変数を要約する際には,summarise関数を用います.summarise関数は,後ほど紹介するグルーピングと組み合わせることで真価を発揮する(ことが多い)のですが,ここでは最も基本的な操作として,複数行のデータを1行に要約する方法を示します.

shop_fuk %>%
  #変数lon(経度)とlat(緯度)の平均値を計算する
  dplyr::summarise(lon_avg=mean(lon),
                   lat_avg=mean(lat))
##    lon_avg  lat_avg
## 1 130.3882 33.58219
shop_fuk %>%
  #変数lon(経度)とlat(緯度)の標準偏差を計算する
  dplyr::summarise(lon_sd=sd(lon),
                   lat_sd=sd(lat))
##       lon_sd     lat_sd
## 1 0.04853594 0.03336123
shop_fuk %>%
  #変数lon(経度)とlat(緯度)の最大値を取得する
  dplyr::summarise(lon_max=max(lon),
                   lat_max=max(lat))
##    lon_max  lat_max
## 1 130.4826 33.70571
shop_fuk %>%
  #変数lon(経度)とlat(緯度)の最小値を取得する
  dplyr::summarise(lon_min=min(lon),
                   lat_min=min(lat))
##    lon_min  lat_min
## 1 130.2131 33.49199
shop_fuk %>%
  #変数CSS_NAME(区名)とMOJI(小地域名)について重複を省いた要素数を数える
  dplyr::summarise(ncssname=dplyr::n_distinct(CSS_NAME),
                   nmoji=dplyr::n_distinct(MOJI))
##   ncssname nmoji
## 1        7   570

新しい列(変数)を追加する

基本的な変数作成方法

 dplyrパッケージのmutate関数は,ベクトルに適用可能な関数をデータフレームの列に適用し,新しい列を作成します.新たに作成する変数の名前は,「オブジェクト(変数)への代入」セクションでの解説等に留意しつつ,任意に決めることができます.ここまでで出てきたベクトル関数のいくつかを用いて,mutate関数の基本的な使い方を示します.

shop_fuk %>%
  #変数lon(経度)とlat(緯度)の和を変数として追加
  dplyr::mutate(newvar=lon+lat) %>%
  #先頭行を表示
  head()
##      osm_id           name        shop KEN_NAME GST_NAME CSS_NAME
## 1 312503423 マリノアシティ        mall   福岡県   福岡市     西区
## 2 473575921       ローソン convenience   福岡県   福岡市   博多区
## 3 477366418   ミニストップ convenience   福岡県   福岡市     東区
## 4 485707416       BOX TOWN         yes   福岡県   福岡市     東区
## 5 485707433 ゆめタウン博多 supermarket   福岡県   福岡市     東区
## 6 495981699         サニー supermarket   福岡県   福岡市   博多区
##             MOJI      lon      lat   newvar
## 1     小戸2丁目 130.3226 33.59501 163.9176
## 2 博多駅東2丁目 130.4237 33.58691 164.0106
## 3     大岳1丁目 130.3446 33.65198 163.9966
## 4     箱崎4丁目 130.4168 33.61967 164.0365
## 5     東浜1丁目 130.4120 33.61187 164.0238
## 6 博多駅南3丁目 130.4264 33.58202 164.0084
shop_fuk %>%
  #変数lon(経度)とlat(緯度)の積を変数として追加
  dplyr::mutate(newvar=lon*lat) %>%
  #先頭行を表示
  head()
##      osm_id           name        shop KEN_NAME GST_NAME CSS_NAME
## 1 312503423 マリノアシティ        mall   福岡県   福岡市     西区
## 2 473575921       ローソン convenience   福岡県   福岡市   博多区
## 3 477366418   ミニストップ convenience   福岡県   福岡市     東区
## 4 485707416       BOX TOWN         yes   福岡県   福岡市     東区
## 5 485707433 ゆめタウン博多 supermarket   福岡県   福岡市     東区
## 6 495981699         サニー supermarket   福岡県   福岡市   博多区
##             MOJI      lon      lat   newvar
## 1     小戸2丁目 130.3226 33.59501 4378.187
## 2 博多駅東2丁目 130.4237 33.58691 4380.529
## 3     大岳1丁目 130.3446 33.65198 4386.355
## 4     箱崎4丁目 130.4168 33.61967 4384.570
## 5     東浜1丁目 130.4120 33.61187 4383.390
## 6 博多駅南3丁目 130.4264 33.58202 4379.983
shop_fuk %>%
  #変数lon(経度)の自然対数値を変数として追加
  dplyr::mutate(newvar=log(lon)) %>%
  #先頭行を表示
  head()
##      osm_id           name        shop KEN_NAME GST_NAME CSS_NAME
## 1 312503423 マリノアシティ        mall   福岡県   福岡市     西区
## 2 473575921       ローソン convenience   福岡県   福岡市   博多区
## 3 477366418   ミニストップ convenience   福岡県   福岡市     東区
## 4 485707416       BOX TOWN         yes   福岡県   福岡市     東区
## 5 485707433 ゆめタウン博多 supermarket   福岡県   福岡市     東区
## 6 495981699         サニー supermarket   福岡県   福岡市   博多区
##             MOJI      lon      lat   newvar
## 1     小戸2丁目 130.3226 33.59501 4.870013
## 2 博多駅東2丁目 130.4237 33.58691 4.870788
## 3     大岳1丁目 130.3446 33.65198 4.870182
## 4     箱崎4丁目 130.4168 33.61967 4.870736
## 5     東浜1丁目 130.4120 33.61187 4.870698
## 6 博多駅南3丁目 130.4264 33.58202 4.870809
shop_fuk %>%
  #変数lon(経度)を文字列型に変換し変数として追加
  dplyr::mutate(newvar=as.character(lon)) %>%
  #データの構造を表示
  str()
## 'data.frame':    2176 obs. of  10 variables:
##  $ osm_id  : chr  "312503423" "473575921" "477366418" "485707416" ...
##  $ name    : chr  "マリノアシティ" "ローソン" "ミニストップ" "BOX TOWN" ...
##  $ shop    : chr  "mall" "convenience" "convenience" "yes" ...
##  $ KEN_NAME: chr  "福岡県" "福岡県" "福岡県" "福岡県" ...
##  $ GST_NAME: chr  "福岡市" "福岡市" "福岡市" "福岡市" ...
##  $ CSS_NAME: chr  "西区" "博多区" "東区" "東区" ...
##  $ MOJI    : chr  "小戸2丁目" "博多駅東2丁目" "大岳1丁目" "箱崎4丁目" ...
##  $ lon     : num  130 130 130 130 130 ...
##  $ lat     : num  33.6 33.6 33.7 33.6 33.6 ...
##  $ newvar  : chr  "130.3225627" "130.4236825" "130.3446347" "130.4168142" ...
shop_fuk %>%
  #変数KEN_NAMEからMOJIまでを文字列結合する
  dplyr::mutate(newvar=paste0(KEN_NAME,GST_NAME,CSS_NAME,MOJI)) %>%
  #先頭行を表示
  head()
##      osm_id           name        shop KEN_NAME GST_NAME CSS_NAME
## 1 312503423 マリノアシティ        mall   福岡県   福岡市     西区
## 2 473575921       ローソン convenience   福岡県   福岡市   博多区
## 3 477366418   ミニストップ convenience   福岡県   福岡市     東区
## 4 485707416       BOX TOWN         yes   福岡県   福岡市     東区
## 5 485707433 ゆめタウン博多 supermarket   福岡県   福岡市     東区
## 6 495981699         サニー supermarket   福岡県   福岡市   博多区
##             MOJI      lon      lat                           newvar
## 1     小戸2丁目 130.3226 33.59501       福岡県福岡市西区小戸2丁目
## 2 博多駅東2丁目 130.4237 33.58691 福岡県福岡市博多区博多駅東2丁目
## 3     大岳1丁目 130.3446 33.65198       福岡県福岡市東区大岳1丁目
## 4     箱崎4丁目 130.4168 33.61967       福岡県福岡市東区箱崎4丁目
## 5     東浜1丁目 130.4120 33.61187       福岡県福岡市東区東浜1丁目
## 6 博多駅南3丁目 130.4264 33.58202 福岡県福岡市博多区博多駅南3丁目

条件分岐を取り入れた変数作成

 mutate関数では,条件分岐を取り入れて変数を作ることも可能です.方法は主にふた通りあり,1つはifelse関数を使う方法,もうひとつはdplyrパッケージのcase_when関数を用いる方法です.可読性の観点からは,case_when関数を用いた方が望ましいです.
 最初の例として,店舗分類shopが「electronics」ならば1,そうでなければ0を取る変数をifelse関数で作成します.次に,店舗分類shopが「supermarket」ならば1,「convenience」ならば2,いずれにも該当しなければ0となる変数を,ifelse関数とcase_when関数の両方で作成します.

##単純な条件分岐
#ifelse関数を用いる
shop_fuk %>%
  #もしshopが「electronics」ならば1,さもなくば0
  dplyr::mutate(newvar=ifelse(shop=="electronics",1,0)) %>%
  #先頭20行を表示
  head(20)
##       osm_id                          name         shop KEN_NAME GST_NAME
## 1  312503423                マリノアシティ         mall   福岡県   福岡市
## 2  473575921                      ローソン  convenience   福岡県   福岡市
## 3  477366418                  ミニストップ  convenience   福岡県   福岡市
## 4  485707416                      BOX TOWN          yes   福岡県   福岡市
## 5  485707433                ゆめタウン博多  supermarket   福岡県   福岡市
## 6  495981699                        サニー  supermarket   福岡県   福岡市
## 7  495989488                    マルショク  supermarket   福岡県   福岡市
## 8  502929378                  ビックカメラ  electronics   福岡県   福岡市
## 9  503886006                          Muse  select shop   福岡県   福岡市
## 10 506232942              ファミリーマート  convenience   福岡県   福岡市
## 11 506232961               セブン-イレブン  convenience   福岡県   福岡市
## 12 510163207 ドン・キホーテ 楽市街道箱崎店  supermarket   福岡県   福岡市
## 13 510163208                    明林堂書店        books   福岡県   福岡市
## 14 534037962                    マルショク  supermarket   福岡県   福岡市
## 15 534043691          マウスコンピューター     computer   福岡県   福岡市
## 16 574367792                福岡リバレイン  supermarket   福岡県   福岡市
## 17 598037000                    エブリワン  convenience   福岡県   福岡市
## 18 697340563                      グッデイ doityourself   福岡県   福岡市
## 19 704397098          マルキョウ・ヤマダイ  supermarket   福岡県   福岡市
## 20 705059464                    マルキョウ  supermarket   福岡県   福岡市
##    CSS_NAME           MOJI      lon      lat newvar
## 1      西区     小戸2丁目 130.3226 33.59501      0
## 2    博多区 博多駅東2丁目 130.4237 33.58691      0
## 3      東区     大岳1丁目 130.3446 33.65198      0
## 4      東区     箱崎4丁目 130.4168 33.61967      0
## 5      東区     東浜1丁目 130.4120 33.61187      0
## 6    博多区 博多駅南3丁目 130.4264 33.58202      0
## 7    博多区 博多駅南2丁目 130.4241 33.58231      0
## 8    中央区     天神2丁目 130.3987 33.58757      1
## 9    中央区     大名1丁目 130.3943 33.58597      0
## 10   博多区 博多駅南3丁目 130.4257 33.58254      0
## 11   博多区 博多駅南1丁目 130.4244 33.58598      0
## 12     東区     箱崎5丁目 130.4196 33.62406      0
## 13     東区     箱崎4丁目 130.4192 33.62255      0
## 14   博多区     千代3丁目 130.4121 33.60167      0
## 15   博多区 博多駅南1丁目 130.4221 33.58707      0
## 16   博多区       下川端町 130.4056 33.59533      0
## 17   博多区     竹下5丁目 130.4342 33.56952      0
## 18     南区     曰佐2丁目 130.4395 33.54001      0
## 19     南区   警弥郷1丁目 130.4311 33.53251      0
## 20     南区     的場2丁目 130.4340 33.54281      0
##複雑な条件分岐
#方法1:ifelse関数を用いる
shop_fuk %>%
  #もしshopが「supermarket」ならば1
  dplyr::mutate(newvar=ifelse(shop=="supermarket",1,
                              #上に該当しないがshopが「convenience」ならば2,さもなくば0
                              ifelse(shop=="convenience",2,0))) %>%
  #先頭20行を表示
  head(20)
##       osm_id                          name         shop KEN_NAME GST_NAME
## 1  312503423                マリノアシティ         mall   福岡県   福岡市
## 2  473575921                      ローソン  convenience   福岡県   福岡市
## 3  477366418                  ミニストップ  convenience   福岡県   福岡市
## 4  485707416                      BOX TOWN          yes   福岡県   福岡市
## 5  485707433                ゆめタウン博多  supermarket   福岡県   福岡市
## 6  495981699                        サニー  supermarket   福岡県   福岡市
## 7  495989488                    マルショク  supermarket   福岡県   福岡市
## 8  502929378                  ビックカメラ  electronics   福岡県   福岡市
## 9  503886006                          Muse  select shop   福岡県   福岡市
## 10 506232942              ファミリーマート  convenience   福岡県   福岡市
## 11 506232961               セブン-イレブン  convenience   福岡県   福岡市
## 12 510163207 ドン・キホーテ 楽市街道箱崎店  supermarket   福岡県   福岡市
## 13 510163208                    明林堂書店        books   福岡県   福岡市
## 14 534037962                    マルショク  supermarket   福岡県   福岡市
## 15 534043691          マウスコンピューター     computer   福岡県   福岡市
## 16 574367792                福岡リバレイン  supermarket   福岡県   福岡市
## 17 598037000                    エブリワン  convenience   福岡県   福岡市
## 18 697340563                      グッデイ doityourself   福岡県   福岡市
## 19 704397098          マルキョウ・ヤマダイ  supermarket   福岡県   福岡市
## 20 705059464                    マルキョウ  supermarket   福岡県   福岡市
##    CSS_NAME           MOJI      lon      lat newvar
## 1      西区     小戸2丁目 130.3226 33.59501      0
## 2    博多区 博多駅東2丁目 130.4237 33.58691      2
## 3      東区     大岳1丁目 130.3446 33.65198      2
## 4      東区     箱崎4丁目 130.4168 33.61967      0
## 5      東区     東浜1丁目 130.4120 33.61187      1
## 6    博多区 博多駅南3丁目 130.4264 33.58202      1
## 7    博多区 博多駅南2丁目 130.4241 33.58231      1
## 8    中央区     天神2丁目 130.3987 33.58757      0
## 9    中央区     大名1丁目 130.3943 33.58597      0
## 10   博多区 博多駅南3丁目 130.4257 33.58254      2
## 11   博多区 博多駅南1丁目 130.4244 33.58598      2
## 12     東区     箱崎5丁目 130.4196 33.62406      1
## 13     東区     箱崎4丁目 130.4192 33.62255      0
## 14   博多区     千代3丁目 130.4121 33.60167      1
## 15   博多区 博多駅南1丁目 130.4221 33.58707      0
## 16   博多区       下川端町 130.4056 33.59533      1
## 17   博多区     竹下5丁目 130.4342 33.56952      2
## 18     南区     曰佐2丁目 130.4395 33.54001      0
## 19     南区   警弥郷1丁目 130.4311 33.53251      1
## 20     南区     的場2丁目 130.4340 33.54281      1
#方法2:case_when関数を用いる
shop_fuk %>%
  dplyr::mutate(newvar=dplyr::case_when(
    #shopが「supermarket」ならば1
    shop=="supermarket" ~ 1,
    #shopが「convenience」ならば2
    shop=="convenience" ~ 2,
    #上記いずれにも当てはまらなければ0
    TRUE ~ 0
  )) %>%
  #先頭20行を表示
  head(20)
##       osm_id                          name         shop KEN_NAME GST_NAME
## 1  312503423                マリノアシティ         mall   福岡県   福岡市
## 2  473575921                      ローソン  convenience   福岡県   福岡市
## 3  477366418                  ミニストップ  convenience   福岡県   福岡市
## 4  485707416                      BOX TOWN          yes   福岡県   福岡市
## 5  485707433                ゆめタウン博多  supermarket   福岡県   福岡市
## 6  495981699                        サニー  supermarket   福岡県   福岡市
## 7  495989488                    マルショク  supermarket   福岡県   福岡市
## 8  502929378                  ビックカメラ  electronics   福岡県   福岡市
## 9  503886006                          Muse  select shop   福岡県   福岡市
## 10 506232942              ファミリーマート  convenience   福岡県   福岡市
## 11 506232961               セブン-イレブン  convenience   福岡県   福岡市
## 12 510163207 ドン・キホーテ 楽市街道箱崎店  supermarket   福岡県   福岡市
## 13 510163208                    明林堂書店        books   福岡県   福岡市
## 14 534037962                    マルショク  supermarket   福岡県   福岡市
## 15 534043691          マウスコンピューター     computer   福岡県   福岡市
## 16 574367792                福岡リバレイン  supermarket   福岡県   福岡市
## 17 598037000                    エブリワン  convenience   福岡県   福岡市
## 18 697340563                      グッデイ doityourself   福岡県   福岡市
## 19 704397098          マルキョウ・ヤマダイ  supermarket   福岡県   福岡市
## 20 705059464                    マルキョウ  supermarket   福岡県   福岡市
##    CSS_NAME           MOJI      lon      lat newvar
## 1      西区     小戸2丁目 130.3226 33.59501      0
## 2    博多区 博多駅東2丁目 130.4237 33.58691      2
## 3      東区     大岳1丁目 130.3446 33.65198      2
## 4      東区     箱崎4丁目 130.4168 33.61967      0
## 5      東区     東浜1丁目 130.4120 33.61187      1
## 6    博多区 博多駅南3丁目 130.4264 33.58202      1
## 7    博多区 博多駅南2丁目 130.4241 33.58231      1
## 8    中央区     天神2丁目 130.3987 33.58757      0
## 9    中央区     大名1丁目 130.3943 33.58597      0
## 10   博多区 博多駅南3丁目 130.4257 33.58254      2
## 11   博多区 博多駅南1丁目 130.4244 33.58598      2
## 12     東区     箱崎5丁目 130.4196 33.62406      1
## 13     東区     箱崎4丁目 130.4192 33.62255      0
## 14   博多区     千代3丁目 130.4121 33.60167      1
## 15   博多区 博多駅南1丁目 130.4221 33.58707      0
## 16   博多区       下川端町 130.4056 33.59533      1
## 17   博多区     竹下5丁目 130.4342 33.56952      2
## 18     南区     曰佐2丁目 130.4395 33.54001      0
## 19     南区   警弥郷1丁目 130.4311 33.53251      1
## 20     南区     的場2丁目 130.4340 33.54281      1

apply族と組み合わせた変数作成(スキップ可)

 かなりアクロバティックですが,apply関数の実行結果を,mutate関数を用いて新たな変数として追加することもできます.以下では,apply関数の第1引数Xにshop_fukの変数lonからlatまでを指定し,行方向の演算(lonの二乗+latの二乗)を行うという処理を記述しています.

shop_fuk %>%
  #apply関数で作成した変数を追加
  #引数Xに,shop_fukの変数lonからlatを指定する
  dplyr::mutate(newvar=apply(X=dplyr::select(.,lon:lat),
                             MARGIN=1,
                             FUN=function(x){
                               #x(引数Xに渡されたデータフレームの行)の第1・第2要素を各々二乗して足し合わせる
                               m <- x[1]^2+x[2]^2
                               #計算結果を返す
                               return(m)
                             })) %>%
  #先頭行を表示
  head()
##      osm_id           name        shop KEN_NAME GST_NAME CSS_NAME
## 1 312503423 マリノアシティ        mall   福岡県   福岡市     西区
## 2 473575921       ローソン convenience   福岡県   福岡市   博多区
## 3 477366418   ミニストップ convenience   福岡県   福岡市     東区
## 4 485707416       BOX TOWN         yes   福岡県   福岡市     東区
## 5 485707433 ゆめタウン博多 supermarket   福岡県   福岡市     東区
## 6 495981699         サニー supermarket   福岡県   福岡市   博多区
##             MOJI      lon      lat   newvar
## 1     小戸2丁目 130.3226 33.59501 18112.59
## 2 博多駅東2丁目 130.4237 33.58691 18138.42
## 3     大岳1丁目 130.3446 33.65198 18122.18
## 4     箱崎4丁目 130.4168 33.61967 18138.83
## 5     東浜1丁目 130.4120 33.61187 18137.04
## 6 博多駅南3丁目 130.4264 33.58202 18138.80

パイプ演算子%>%を用いた場合,関数の第1引数は省略可能であることが多いのですが,組み合わせて用いる関数によっては,%>%で渡されるオブジェクトを「.」で明示する必要があります.

shop_fuk %>%
  #shop_fukから変数osm_id,lon,latを抽出
  dplyr::select(osm_id,lon,lat) %>%
  dplyr::mutate(newvar=apply(X=dplyr::select(.,lon:lat),
                             MARGIN=1,
                             FUN=function(x){
                               m <- x[1]^2+x[2]^2
                               return(m)
                             })) %>%
  head()
##      osm_id      lon      lat   newvar
## 1 312503423 130.3226 33.59501 18112.59
## 2 473575921 130.4237 33.58691 18138.42
## 3 477366418 130.3446 33.65198 18122.18
## 4 485707416 130.4168 33.61967 18138.83
## 5 485707433 130.4120 33.61187 18137.04
## 6 495981699 130.4264 33.58202 18138.80

その他よく使う関数

 ある変数を1行上にずらした変数を新たに追加する場合はdplyrパッケージのlead関数,1つずらした変数を追加するにはlag関数を用います.

#変数lon(経度)1行上にずらした変数を作成
shop_fuk %>%
  dplyr::mutate(newvar=dplyr::lead(lon)) %>%
  #先頭行を表示
  head()
##      osm_id           name        shop KEN_NAME GST_NAME CSS_NAME
## 1 312503423 マリノアシティ        mall   福岡県   福岡市     西区
## 2 473575921       ローソン convenience   福岡県   福岡市   博多区
## 3 477366418   ミニストップ convenience   福岡県   福岡市     東区
## 4 485707416       BOX TOWN         yes   福岡県   福岡市     東区
## 5 485707433 ゆめタウン博多 supermarket   福岡県   福岡市     東区
## 6 495981699         サニー supermarket   福岡県   福岡市   博多区
##             MOJI      lon      lat   newvar
## 1     小戸2丁目 130.3226 33.59501 130.4237
## 2 博多駅東2丁目 130.4237 33.58691 130.3446
## 3     大岳1丁目 130.3446 33.65198 130.4168
## 4     箱崎4丁目 130.4168 33.61967 130.4120
## 5     東浜1丁目 130.4120 33.61187 130.4264
## 6 博多駅南3丁目 130.4264 33.58202 130.4241
#変数lon(経度)1行下にずらした変数を作成
shop_fuk %>%
  dplyr::mutate(newvar=dplyr::lag(lon)) %>%
  #先頭行を表示
  head()
##      osm_id           name        shop KEN_NAME GST_NAME CSS_NAME
## 1 312503423 マリノアシティ        mall   福岡県   福岡市     西区
## 2 473575921       ローソン convenience   福岡県   福岡市   博多区
## 3 477366418   ミニストップ convenience   福岡県   福岡市     東区
## 4 485707416       BOX TOWN         yes   福岡県   福岡市     東区
## 5 485707433 ゆめタウン博多 supermarket   福岡県   福岡市     東区
## 6 495981699         サニー supermarket   福岡県   福岡市   博多区
##             MOJI      lon      lat   newvar
## 1     小戸2丁目 130.3226 33.59501       NA
## 2 博多駅東2丁目 130.4237 33.58691 130.3226
## 3     大岳1丁目 130.3446 33.65198 130.4237
## 4     箱崎4丁目 130.4168 33.61967 130.3446
## 5     東浜1丁目 130.4120 33.61187 130.4168
## 6 博多駅南3丁目 130.4264 33.58202 130.4120

 データのレコードに通し番号の変数を追加する場合は,dplyrパッケージのrow_number()関数を用います.

#通し番号変数を追加
shop_fuk %>%
  dplyr::mutate(newvar=dplyr::row_number()) %>%
  #先頭行を表示
  head()
##      osm_id           name        shop KEN_NAME GST_NAME CSS_NAME
## 1 312503423 マリノアシティ        mall   福岡県   福岡市     西区
## 2 473575921       ローソン convenience   福岡県   福岡市   博多区
## 3 477366418   ミニストップ convenience   福岡県   福岡市     東区
## 4 485707416       BOX TOWN         yes   福岡県   福岡市     東区
## 5 485707433 ゆめタウン博多 supermarket   福岡県   福岡市     東区
## 6 495981699         サニー supermarket   福岡県   福岡市   博多区
##             MOJI      lon      lat newvar
## 1     小戸2丁目 130.3226 33.59501      1
## 2 博多駅東2丁目 130.4237 33.58691      2
## 3     大岳1丁目 130.3446 33.65198      3
## 4     箱崎4丁目 130.4168 33.61967      4
## 5     東浜1丁目 130.4120 33.61187      5
## 6 博多駅南3丁目 130.4264 33.58202      6

複数変数を一括処理

 ここまで紹介した関数のうち,summarise関数やmutate関数と組み合わせて用いると便利なのが,dplyrパッケージのacross関数です.across関数は,複数の列(変数)に対して同じ処理を適用したい時に用います.まずは,summarise関数・mutate関数の各々と組み合わせた例を以下で示します.

#summarise関数との組み合わせ
#acrossを用いない場合
shop_fuk %>%
  #変数lon(経度)とlat(緯度)の最大値を取得する
  dplyr::summarise(lon_max=max(lon),
                   lat_max=max(lat))
##    lon_max  lat_max
## 1 130.4826 33.70571
#acrossを用いる場合
shop_fuk %>%
  #変数lon(経度)とlat(緯度)の最大値を取得する
  dplyr::summarise(dplyr::across(lon:lat,~max(.)))
##        lon      lat
## 1 130.4826 33.70571
#mutate関数との組み合わせ
#acrossを用いない場合
shop_fuk %>%
  #変数KEN_NAME,GST_NAME,CSS_NAME,MOJIの値の先頭に「40_」という文字列を結合する
  dplyr::mutate(KEN_NAME=paste0("40_",KEN_NAME),
                GST_NAME=paste0("40_",GST_NAME),
                CSS_NAME=paste0("40_",CSS_NAME),
                MOJI=paste0("40_",MOJI)) %>%
  #先頭行を表示
  head()
##      osm_id           name        shop  KEN_NAME  GST_NAME  CSS_NAME
## 1 312503423 マリノアシティ        mall 40_福岡県 40_福岡市   40_西区
## 2 473575921       ローソン convenience 40_福岡県 40_福岡市 40_博多区
## 3 477366418   ミニストップ convenience 40_福岡県 40_福岡市   40_東区
## 4 485707416       BOX TOWN         yes 40_福岡県 40_福岡市   40_東区
## 5 485707433 ゆめタウン博多 supermarket 40_福岡県 40_福岡市   40_東区
## 6 495981699         サニー supermarket 40_福岡県 40_福岡市 40_博多区
##                MOJI      lon      lat
## 1     40_小戸2丁目 130.3226 33.59501
## 2 40_博多駅東2丁目 130.4237 33.58691
## 3     40_大岳1丁目 130.3446 33.65198
## 4     40_箱崎4丁目 130.4168 33.61967
## 5     40_東浜1丁目 130.4120 33.61187
## 6 40_博多駅南3丁目 130.4264 33.58202
#acrossを用いる場合
shop_fuk %>%
  #変数KEN_NAME,GST_NAME,CSS_NAME,MOJIの値の先頭に「40_」という文字列を結合する
  dplyr::mutate(across(KEN_NAME:MOJI,~paste0("40_",.))) %>%
  #先頭行を表示
  head()
##      osm_id           name        shop  KEN_NAME  GST_NAME  CSS_NAME
## 1 312503423 マリノアシティ        mall 40_福岡県 40_福岡市   40_西区
## 2 473575921       ローソン convenience 40_福岡県 40_福岡市 40_博多区
## 3 477366418   ミニストップ convenience 40_福岡県 40_福岡市   40_東区
## 4 485707416       BOX TOWN         yes 40_福岡県 40_福岡市   40_東区
## 5 485707433 ゆめタウン博多 supermarket 40_福岡県 40_福岡市   40_東区
## 6 495981699         サニー supermarket 40_福岡県 40_福岡市 40_博多区
##                MOJI      lon      lat
## 1     40_小戸2丁目 130.3226 33.59501
## 2 40_博多駅東2丁目 130.4237 33.58691
## 3     40_大岳1丁目 130.3446 33.65198
## 4     40_箱崎4丁目 130.4168 33.61967
## 5     40_東浜1丁目 130.4120 33.61187
## 6 40_博多駅南3丁目 130.4264 33.58202

いずれのケースでも,across関数の最初の引数には処理を行う対象の列(変数)群,次の引数には記号「~」に続けて処理の内容が指定されています.処理内容の中にある「.」は,処理対象列(変数)の値を意味します.

データのグルーピング

 何かしらの変数に基づいて,データフレームをグループ化する際には,dplyrパッケージのgroup_by関数を用います.group_by関数とsummarise関数・mutate関数を組み合わせることによって,グループ毎の集計や変数作成が可能です.グループ処理が終わったら,ungroup関数でグループ化情報を削除します.まず,group_by関数とsummarise関数を組み合わせて用いた例を以下で示します.

#単純集計(区別レコード数)
shop_fuk %>%
  #変数CSS_NAME(区名)でグループ化
  dplyr::group_by(CSS_NAME) %>%
  #グループ毎にレコード数を数える
  dplyr::summarise(count=n()) %>%
  #グループ化情報を削除
  dplyr::ungroup()
## # A tibble: 7 × 2
##   CSS_NAME count
##   <chr>    <int>
## 1 城南区     193
## 2 西区       309
## 3 早良区     274
## 4 中央区     312
## 5 東区       461
## 6 南区       259
## 7 博多区     368
#クロス集計(区別店舗分類別レコード数)
shop_fuk %>%
  #変数CSS_NAME(区名),shop(店舗分類)でグループ化
  dplyr::group_by(CSS_NAME,shop) %>%
  #グループ毎にレコード数を数える
  dplyr::summarise(count=n()) %>%
  #shop(店舗分類)で並び替え
  dplyr::arrange(shop) %>%
  #グループ化情報を削除
  dplyr::ungroup()
## # A tibble: 379 × 3
##    CSS_NAME shop          count
##    <chr>    <chr>         <int>
##  1 早良区   100円ショップ     1
##  2 城南区   alcohol           3
##  3 西区     alcohol           1
##  4 早良区   alcohol           4
##  5 中央区   alcohol           2
##  6 東区     alcohol           4
##  7 南区     alcohol           2
##  8 博多区   alcohol           2
##  9 中央区   anime             1
## 10 城南区   appliance         2
## # … with 369 more rows
## # ℹ Use `print(n = ...)` to see more rows
#区(CSS_NAME)毎に変数lon(経度)・lat(緯度)の平均値を計算する
shop_fuk %>%
  #変数CSS_NAME(区名)でグループ化
  dplyr::group_by(CSS_NAME) %>%
  #変数lon(経度)・lat(緯度)の平均値を計算
  dplyr::summarise(dplyr::across(lon:lat,~max(.))) %>%
  #グループ化情報を削除
  dplyr::ungroup()
## # A tibble: 7 × 3
##   CSS_NAME   lon   lat
##   <chr>    <dbl> <dbl>
## 1 城南区    130.  33.6
## 2 西区      130.  33.6
## 3 早良区    130.  33.6
## 4 中央区    130.  33.6
## 5 東区      130.  33.7
## 6 南区      130.  33.6
## 7 博多区    130.  33.6

 次に,group_by関数とmutate関数を組み合わせて用いた例を以下で示します.

#変数CSS_NAME(区名)毎に通し番号を付与
shop_fuk %>%
  #変数CSS_NAME(区名)でグループ化
  dplyr::group_by(CSS_NAME) %>%
  #グループ毎に通し番号変数を追加する
  dplyr::mutate(newvar=dplyr::row_number()) %>%
  #通し番号変数で並び替え
  dplyr::arrange(newvar) %>%
  #グループ化情報を削除
  dplyr::ungroup() %>%
  #先頭20行を表示
  head(20)
## # A tibble: 20 × 10
##    osm_id     name        shop  KEN_N…¹ GST_N…² CSS_N…³ MOJI    lon   lat newvar
##    <chr>      <chr>       <chr> <chr>   <chr>   <chr>   <chr> <dbl> <dbl>  <int>
##  1 312503423  マリノアシ… mall  福岡県  福岡市  西区    小戸…  130.  33.6      1
##  2 473575921  ローソン    conv… 福岡県  福岡市  博多区  博多…  130.  33.6      1
##  3 477366418  ミニストッ… conv… 福岡県  福岡市  東区    大岳…  130.  33.7      1
##  4 502929378  ビックカメ… elec… 福岡県  福岡市  中央区  天神…  130.  33.6      1
##  5 697340563  グッデイ    doit… 福岡県  福岡市  南区    曰佐…  130.  33.5      1
##  6 766979692  ローソン    conv… 福岡県  福岡市  城南区  別府…  130.  33.6      1
##  7 811431676  ローソン    conv… 福岡県  福岡市  早良区  次郎…  130.  33.6      1
##  8 485707416  BOX TOWN    yes   福岡県  福岡市  東区    箱崎…  130.  33.6      2
##  9 495981699  サニー      supe… 福岡県  福岡市  博多区  博多…  130.  33.6      2
## 10 503886006  Muse        sele… 福岡県  福岡市  中央区  大名…  130.  33.6      2
## 11 704397098  マルキョウ… supe… 福岡県  福岡市  南区    警弥…  130.  33.5      2
## 12 770591757  サニー      supe… 福岡県  福岡市  城南区  鳥飼…  130.  33.6      2
## 13 817067817  セブン-イ…  conv… 福岡県  福岡市  早良区  野芥…  130.  33.5      2
## 14 1010255858 <NA>        yes   福岡県  福岡市  西区    西都…  130.  33.6      2
## 15 485707433  ゆめタウン… supe… 福岡県  福岡市  東区    東浜…  130.  33.6      3
## 16 495989488  マルショク  supe… 福岡県  福岡市  博多区  博多…  130.  33.6      3
## 17 705059464  マルキョウ  supe… 福岡県  福岡市  南区    的場…  130.  33.5      3
## 18 748630354  ファミリー… conv… 福岡県  福岡市  中央区  舞鶴…  130.  33.6      3
## 19 817067819  ローソン    conv… 福岡県  福岡市  早良区  東入…  130.  33.5      3
## 20 1772204898 <NA>        conf… 福岡県  福岡市  西区    大字…  130.  33.6      3
## # … with abbreviated variable names ¹​KEN_NAME, ²​GST_NAME, ³​CSS_NAME
#変数CSS_NAME(区名)毎に変数lon(経度)のラグ変数を作成する
shop_fuk %>%
  #変数CSS_NAME(区名)でグループ化
  dplyr::group_by(CSS_NAME) %>%
  #グループ毎に変数lon(経度)のラグ変数を追加する
  dplyr::mutate(newvar=dplyr::lag(lon)) %>%
  #グループ化情報を削除
  dplyr::ungroup()
## # A tibble: 2,176 × 10
##    osm_id    name         shop  KEN_N…¹ GST_N…² CSS_N…³ MOJI    lon   lat newvar
##    <chr>     <chr>        <chr> <chr>   <chr>   <chr>   <chr> <dbl> <dbl>  <dbl>
##  1 312503423 マリノアシ…  mall  福岡県  福岡市  西区    小戸…  130.  33.6    NA 
##  2 473575921 ローソン     conv… 福岡県  福岡市  博多区  博多…  130.  33.6    NA 
##  3 477366418 ミニストップ conv… 福岡県  福岡市  東区    大岳…  130.  33.7    NA 
##  4 485707416 BOX TOWN     yes   福岡県  福岡市  東区    箱崎…  130.  33.6   130.
##  5 485707433 ゆめタウン…  supe… 福岡県  福岡市  東区    東浜…  130.  33.6   130.
##  6 495981699 サニー       supe… 福岡県  福岡市  博多区  博多…  130.  33.6   130.
##  7 495989488 マルショク   supe… 福岡県  福岡市  博多区  博多…  130.  33.6   130.
##  8 502929378 ビックカメラ elec… 福岡県  福岡市  中央区  天神…  130.  33.6    NA 
##  9 503886006 Muse         sele… 福岡県  福岡市  中央区  大名…  130.  33.6   130.
## 10 506232942 ファミリー…  conv… 福岡県  福岡市  博多区  博多…  130.  33.6   130.
## # … with 2,166 more rows, and abbreviated variable names ¹​KEN_NAME, ²​GST_NAME,
## #   ³​CSS_NAME
## # ℹ Use `print(n = ...)` to see more rows

データフレームの結合

 ある変数をキーとして,データセット間結合を行うための関数が,dplyrパッケージでは複数用意されています.ふたつのデータセットをA・B,キー変数をkeyとすると,よく用いられる各種関数の基本形と操作内容は以下のようにまとめられます.

  • left_join(x=A,y=B,by=“key”):BをAに対応付けて結合する(Aが全て残る)
  • inner_join(x=A,y=B,by=“key”):AとBの両方にある行のみ残す
  • full_join(x=A,y=B,by=“key”):AとBの全ての値と行を残す

左結合

 以下では,店舗テーブルshop_fukとOSM属性テーブルosm_shop_descを結合する方法を示します.キー変数の変数名は,shop_fuk内ではshop,osm_shop_desc内ではValueとなっているので,結合に先立ってosm_shop_desc内の変数を変更します.変数名の変更には,dplyrパッケージのrename関数を用います.rename関数内の条件式の左辺には変更後の名前,右辺には変更前の名前がきます.また,変数Commentは以後使わないので,select関数を用いて削除します.

osm_shop_desc_for_join <- osm_shop_desc %>%
  #変数名をValueからshopに変更
  dplyr::rename(shop=Value) %>%
  #変数Commentを削除
  dplyr::select(-Comment)
#データの先頭行を表示
head(osm_shop_desc_for_join)
##    Key             shop        Category
## 1 shop          alcohol Food, beverages
## 2 shop           bakery Food, beverages
## 3 shop        beverages Food, beverages
## 4 shop brewing_supplies Food, beverages
## 5 shop          butcher Food, beverages
## 6 shop           cheese Food, beverages

left_join関数を用いて,店舗テーブルshop_fukに変数名変更済みのOSM属性テーブルosm_shop_descを結合します.

shop_fuk_lj <- shop_fuk %>%
  #変数shopをキー変数として,shop_fukにosm_shop_desc_for_joinを結合
  dplyr::left_join(y=osm_shop_desc_for_join,by="shop")
#データの先頭行を表示
head(shop_fuk_lj)
##      osm_id           name        shop KEN_NAME GST_NAME CSS_NAME
## 1 312503423 マリノアシティ        mall   福岡県   福岡市     西区
## 2 473575921       ローソン convenience   福岡県   福岡市   博多区
## 3 477366418   ミニストップ convenience   福岡県   福岡市     東区
## 4 485707416       BOX TOWN         yes   福岡県   福岡市     東区
## 5 485707433 ゆめタウン博多 supermarket   福岡県   福岡市     東区
## 6 495981699         サニー supermarket   福岡県   福岡市   博多区
##             MOJI      lon      lat  Key                              Category
## 1     小戸2丁目 130.3226 33.59501 shop General store, department store, mall
## 2 博多駅東2丁目 130.4237 33.58691 shop                       Food, beverages
## 3     大岳1丁目 130.3446 33.65198 shop                       Food, beverages
## 4     箱崎4丁目 130.4168 33.61967 <NA>                                  <NA>
## 5     東浜1丁目 130.4120 33.61187 shop General store, department store, mall
## 6 博多駅南3丁目 130.4264 33.58202 shop General store, department store, mall

 キー変数を指定する引数byの書き方を工夫すると,キー変数の名前をデータフレーム間で揃えなくても結合が行えます.shop_fuk内でのキー変数の名前はshop,osm_shop_desc内でのキー変数の名前はValueでしたが,引数byを,

by=c(“shop”=“Value”)

と記述すれば,変数名の変更なしで結合が可能です.変数Commentを削除する処理を追加すると,先ほどと同じ結合済みのデータフレームが得られます.

shop_fuk_lj <- shop_fuk %>%
  #shop_fukにosm_shop_descを結合
  dplyr::left_join(y=osm_shop_desc,by=c("shop"="Value")) %>%
  #変数Commentを削除
  dplyr::select(-Comment)
#データの先頭行を表示
head(shop_fuk_lj)
##      osm_id           name        shop KEN_NAME GST_NAME CSS_NAME
## 1 312503423 マリノアシティ        mall   福岡県   福岡市     西区
## 2 473575921       ローソン convenience   福岡県   福岡市   博多区
## 3 477366418   ミニストップ convenience   福岡県   福岡市     東区
## 4 485707416       BOX TOWN         yes   福岡県   福岡市     東区
## 5 485707433 ゆめタウン博多 supermarket   福岡県   福岡市     東区
## 6 495981699         サニー supermarket   福岡県   福岡市   博多区
##             MOJI      lon      lat  Key                              Category
## 1     小戸2丁目 130.3226 33.59501 shop General store, department store, mall
## 2 博多駅東2丁目 130.4237 33.58691 shop                       Food, beverages
## 3     大岳1丁目 130.3446 33.65198 shop                       Food, beverages
## 4     箱崎4丁目 130.4168 33.61967 <NA>                                  <NA>
## 5     東浜1丁目 130.4120 33.61187 shop General store, department store, mall
## 6 博多駅南3丁目 130.4264 33.58202 shop General store, department store, mall

内部結合

 店舗テーブルshop_fuk内の変数shopには「yes」という分類(不明を意味する)が存在しますが,osm_shop_desc内の変数Valueには存在しません.故に,先ほどのleft_join関数の実行結果の中では,shop_fuk内の変数shopの値が「yes」であるとき,osm_shop_desc内の変数Categoryは結合されずNAとなっています.

shop_fuk_lj %>%
  #変数shopの値が「yes」であるレコードのみ残す
  dplyr::filter(shop=="yes") %>%
  #先頭行を表示
  head()
##       osm_id                   name shop KEN_NAME GST_NAME CSS_NAME       MOJI
## 1  485707416               BOX TOWN  yes   福岡県   福岡市     東区 箱崎4丁目
## 2 1010255858                   <NA>  yes   福岡県   福岡市     西区 西都1丁目
## 3 4852895794 Laps - la pet supplies  yes   福岡県   福岡市     南区 野間3丁目
## 4 6202491589                 林商店  yes   福岡県   福岡市     東区 箱崎1丁目
## 5 6202699556         おはぎ・おこわ  yes   福岡県   福岡市     東区 箱崎1丁目
## 6 6243429877               神田商店  yes   福岡県   福岡市     東区 東浜1丁目
##        lon      lat  Key Category
## 1 130.4168 33.61967 <NA>     <NA>
## 2 130.2595 33.58091 <NA>     <NA>
## 3 130.4128 33.56036 <NA>     <NA>
## 4 130.4241 33.61853 <NA>     <NA>
## 5 130.4230 33.61658 <NA>     <NA>
## 6 130.4137 33.61683 <NA>     <NA>

inner_join関数の実行結果では,このようなケースは自動的に削除されます.まず,left_join関数と同じ要領でinner_join関数を実行します.

shop_fuk_ij <- shop_fuk %>%
  #shop_fukにosm_shop_descを結合
  dplyr::inner_join(y=osm_shop_desc,by=c("shop"="Value")) %>%
  #変数Commentを削除
  dplyr::select(-Comment)
#データの先頭行を表示
head(shop_fuk_ij)
##      osm_id           name        shop KEN_NAME GST_NAME CSS_NAME
## 1 312503423 マリノアシティ        mall   福岡県   福岡市     西区
## 2 473575921       ローソン convenience   福岡県   福岡市   博多区
## 3 477366418   ミニストップ convenience   福岡県   福岡市     東区
## 4 485707433 ゆめタウン博多 supermarket   福岡県   福岡市     東区
## 5 495981699         サニー supermarket   福岡県   福岡市   博多区
## 6 495989488     マルショク supermarket   福岡県   福岡市   博多区
##             MOJI      lon      lat  Key                              Category
## 1     小戸2丁目 130.3226 33.59501 shop General store, department store, mall
## 2 博多駅東2丁目 130.4237 33.58691 shop                       Food, beverages
## 3     大岳1丁目 130.3446 33.65198 shop                       Food, beverages
## 4     東浜1丁目 130.4120 33.61187 shop General store, department store, mall
## 5 博多駅南3丁目 130.4264 33.58202 shop General store, department store, mall
## 6 博多駅南2丁目 130.4241 33.58231 shop General store, department store, mall

続いて,inner_join関数の実行結果の中に,変数shopの値が「yes」であるレコードが含まれるかを調べると,レコード数は0となることが分かります.

shop_fuk_ij %>%
  #変数shopの値が「yes」であるレコードのみ残す
  dplyr::filter(shop=="yes") %>%
  #先頭行を表示
  head()
##  [1] osm_id   name     shop     KEN_NAME GST_NAME CSS_NAME MOJI     lon     
##  [9] lat      Key      Category
##  <0 行> (または長さ 0 の row.names)

外部結合

 left_join・inner_join関数と同じ要領でfull_join関数を実行すると,以下のようになります.

shop_fuk_fj <- shop_fuk %>%
  #shop_fukにosm_shop_descを結合
  dplyr::full_join(y=osm_shop_desc,by=c("shop"="Value")) %>%
  #変数Commentを削除
  dplyr::select(-Comment)
#データの先頭行を表示
head(shop_fuk_fj)
##      osm_id           name        shop KEN_NAME GST_NAME CSS_NAME
## 1 312503423 マリノアシティ        mall   福岡県   福岡市     西区
## 2 473575921       ローソン convenience   福岡県   福岡市   博多区
## 3 477366418   ミニストップ convenience   福岡県   福岡市     東区
## 4 485707416       BOX TOWN         yes   福岡県   福岡市     東区
## 5 485707433 ゆめタウン博多 supermarket   福岡県   福岡市     東区
## 6 495981699         サニー supermarket   福岡県   福岡市   博多区
##             MOJI      lon      lat  Key                              Category
## 1     小戸2丁目 130.3226 33.59501 shop General store, department store, mall
## 2 博多駅東2丁目 130.4237 33.58691 shop                       Food, beverages
## 3     大岳1丁目 130.3446 33.65198 shop                       Food, beverages
## 4     箱崎4丁目 130.4168 33.61967 <NA>                                  <NA>
## 5     東浜1丁目 130.4120 33.61187 shop General store, department store, mall
## 6 博多駅南3丁目 130.4264 33.58202 shop General store, department store, mall

結合結果から,shop_fuk側の属性(例えばKEN_NAME)もしくはosm_shop_desc側の属性(例えばCategory)がNAであるレコードを表示します.

shop_fuk_fj %>%
  #変数KEN_NAMEがNAもしくは変数CategoryがNAのケースを抽出
  dplyr::filter(is.na(KEN_NAME)|is.na(Category)) %>%
  #先頭行を表示
  head()
##       osm_id         name          shop KEN_NAME GST_NAME CSS_NAME         MOJI
## 1  485707416     BOX TOWN           yes   福岡県   福岡市     東区   箱崎4丁目
## 2  503886006         Muse   select shop   福岡県   福岡市   中央区   大名1丁目
## 3 1010255858         <NA>           yes   福岡県   福岡市     西区   西都1丁目
## 4 3567241668 シルビア福岡         dance   福岡県   福岡市   中央区   天神2丁目
## 5 4730050316     ダイソー 100円ショップ   福岡県   福岡市   早良区 小田部5丁目
## 6 4800530722   まんだらけ         hobby   福岡県   福岡市   中央区   大名2丁目
##        lon      lat  Key Category
## 1 130.4168 33.61967 <NA>     <NA>
## 2 130.3943 33.58597 <NA>     <NA>
## 3 130.2595 33.58091 <NA>     <NA>
## 4 130.3965 33.59046 <NA>     <NA>
## 5 130.3317 33.56853 <NA>     <NA>
## 6 130.3936 33.58996 <NA>     <NA>