このチュートリアルでは,『事例で学ぶ経済・政策分析のための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ではコメントとして認識され,プログラムとしては実行されません.
#足し算
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で生成される様々な値・データなどを代入・格納することが可能です.同じ名前のオブジェクトは,後に作成されたもので上書きされます.また,オブジェクトの名前を付ける際には,例えば以下の事項に注意が必要です.
#例えば,オブジェクト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
RでのFor文(繰り返しを記述する構文)は以下のようになる.シークエンスには,数値ベクトルや文字列ベクトルが用いられます.
for(変数名 in シークエンス){
処理
}
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
RでのWhile文(ある条件が満たされている限り処理を続ける構文)は以下のようになります.
while(条件){
処理
}
iの値が5より小さいという条件(i<5)が満たされている限り,iに1を足し続けるという処理を行います.
while(i<5){
#iに1を足す
i <- i+1
}
#最終的なiの値
i
## [1] 5
RでのIf文(条件に応じて処理内容が分岐する構文)は以下のようになります.
if(条件1){
処理1
}else if(条件2){
処理2
}else{
処理3
}
条件1を満たせば処理1が,条件1を満たさないが条件2を満たせば処理2が,条件1・2両方を満たさなければ処理3が実行されます.
変数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族は,ベクトル・行列・リスト・データフレームに対して,一括して何かしらの関数を適用する時に利用します.出入力するデータの方に応じて異なる関数が用意されていますが,主に用いられる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関数は,行列・データフレームに対して,行方向もしくは列方向に関数を適用します.第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関数は,リスト・ベクトルに対して,行方向もしくは列方向に関数を適用します.第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つです.
csv形式のデータの読み込みには,read.csv関数を用います.引数fileにはファイル名を指定します.このRmdと同じディレクトリにファイルが置かれている場合には,ファイル名のみを指定すれば良いのですが,別のディレクトリに置かれている場合は,以下のいずれかの方法を取る必要があります.
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属性テーブルのxlsxを読み込みます.osm_shop_descの変数の定義は以下の通りです.
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とすれば,以下のものが挙げられます.
手始めとして,住所情報がNAではないレコードのみを抽出します.例えば,小地域名の変数MOJIがNAでないものを抽出します(MOJIがNAでなければ,KEN_NAME等の上位階層の住所変数もNAではないので).その前に,抽出前のレコード数を示します.
#抽出前のレコード数
dim(shop_fuk)
## [1] 2704 9
変数MOJIがNAでないレコードを抽出する為のコードは以下のようになります.「%>%」はパイプ演算子と呼ばれるもので,左辺のオブジェクトを右辺関数の第1引数として渡す役割を持ちます.例えば,
抽出後のレコードを確認すると,変数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関数の利点は,様々な条件に応じて列(変数)を抽出できることです.抽出条件として使えるものの例として,以下のものが挙げられます.
これら抽出条件を実行した結果を,順を追って示します.各抽出条件の直前に否定演算子「!」をつければ,その条件に当て「はまらない」列を抽出できます.また,条件を複数組み合わせることもできます.
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関数の実行結果を,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とすると,よく用いられる各種関数の基本形と操作内容は以下のようにまとめられます.
以下では,店舗テーブル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>