(Press ?
for help, n
and p
for next and previous slide)
村田 昇
2020.05.01
下記は代表的なもので,これ以外にもある
論理値で指定
TRUE
: 要素の選択FALSE
: 要素の 除外
(欠損値 NA
が含まれると正しく指定できない場合があるので注意)
datasets::airquality
(Rに準備されている)help(airquality)
または ?ariquality
で詳細を確認)行番号による指定
## 抽出する行番号のベクトルで指定
airquality[1:10,] # 1-10行を抽出
Ozone Solar.R Wind Temp Month Day 1 41 190 7.4 67 5 1 2 36 118 8.0 72 5 2 3 12 149 12.6 74 5 3 4 18 313 11.5 62 5 4 5 NA NA 14.3 56 5 5 6 28 NA 14.9 66 5 6 7 23 299 8.6 65 5 7 8 19 99 13.8 59 5 8 9 8 19 20.1 61 5 9 10 NA 194 8.6 69 5 10
条件の指定
## 条件に合致する行はTRUE (NAは欠損値)
airquality[1:16,]$Ozone>100 # 条件の指定
airquality[1:16,]$Ozone>100 & airquality[1:16,]$Wind<=5 # 条件のAND
with(airquality[1:16,], Ozone>100 & Wind<=5) # 上と同じ(短い書き方)
with(airquality[1:24,], Ozone>100 | Wind<=5) # 条件のOR
[1] FALSE FALSE FALSE FALSE NA FALSE FALSE FALSE [9] FALSE NA FALSE FALSE FALSE FALSE FALSE FALSE [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE [9] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE [9] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE [1] FALSE FALSE FALSE FALSE NA FALSE FALSE FALSE [9] FALSE NA FALSE FALSE FALSE FALSE FALSE FALSE [17] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
条件に合致する行番号の抽出
## 関数whichでTRUEの番号を抽出
which(with(airquality, Ozone>100 & Wind<=5)) # 全データから抽出
[1] 62 99 117 121
条件に合致する行の抽出
## 行の抽出
airquality[which(with(airquality, Ozone>100 & Wind<=5)), ]
Ozone Solar.R Wind Temp Month Day 62 135 269 4.1 84 7 1 99 122 255 4.0 89 8 7 117 168 238 3.4 81 8 25 121 118 225 2.3 94 8 29
列番号による指定
## 列番号のベクトルで指定
airquality[which(with(airquality, Ozone>100 & Wind<=5)), c(1,5,6)]
Ozone Month Day 62 135 7 1 99 122 8 7 117 168 8 25 121 118 8 29
列名による指定
## 複数の列の場合
airquality[which(with(airquality, Ozone>100 & Wind<=5)),
c("Month","Day")]
Month Day 62 7 1 99 8 7 117 8 25 121 8 29
## 1つの列の場合は以下でも良い (ただしベクトルになる)
airquality[which(with(airquality, Ozone>100 & Wind<=5)),]$Month
[1] 7 8 8 8
subset()
複合的な条件を指定してデータを整理する
基本書式
subset(x,subset,select,drop=FALSE)
x
: データフレームsubset
: 抽出する行の条件select
: 列の選択(未指定の場合は全ての列)drop
: 結果が1行または1列の場合ベクトルとする(TRUE)かデータフレームとする(FALSE)かsubset()
の例 (1/3)前出の例の書き換え
subset(airquality,
subset = Ozone>100 & Wind<=5,
select = c(1,5,6))
subset(airquality,
Ozone>100 & Wind<=5, # 順序通りなら引数の名前は省略可
c(Month,Day)) # 名前は$の後と同じ扱い
Ozone Month Day 62 135 7 1 99 122 8 7 117 168 8 25 121 118 8 29 Month Day 62 7 1 99 8 7 117 8 25 121 8 29
subset()
の例 (2/3)いろいろな記述の仕方
## Ozoneに欠測(NA)がなく, かつDayが5か10のWindからDayまでの列を抽出
subset(airquality,
subset = !is.na(Ozone) & Day %in% c(5,10),
select = Wind:Day)
Wind Temp Month Day 41 11.5 87 6 10 66 4.6 83 7 5 71 7.4 89 7 10 97 7.4 85 8 5 128 7.4 87 9 5 133 9.7 73 9 10
subset()
の例 (3/3)いろいろな記述の仕方
## Ozoneが120以上か,またはWindが3以下のTemp以外の列を抽出
subset(airquality,
subset = Ozone>120 | Wind <= 3,
select = -Temp)
Ozone Solar.R Wind Month Day 53 NA 59 1.7 6 22 62 135 269 4.1 7 1 99 122 255 4.0 8 7 117 168 238 3.4 8 25 121 118 225 2.3 8 29 126 73 183 2.8 9 3
datasets::airquality
に対して
以下の条件を満たすデータを取り出しなさい.
Ozone
)Wind
) が時速10マイル以上で,
かつ気温 (Temp
) が華氏80度以上の日のデータOzone
) も日射量 (Solar.R
) も
欠測 (NA
) でないデータの月 (Month
) と日 (Day
)getwd()
setwd()
getwd()/setwd()
の例## 作業ディレクトリの確認 (環境によって実行結果が異なる)
getwd()
## 作業ディレクトリの移動 (環境によって指定の仕方も異なる)
setwd("~/Documents") # ホームディレクトリ下の「書類」フォルダに移動
write.csv()
データフレームをCSVファイルへ書き出す
基本書式
write.csv(x, file="ファイル名")
x
: 書き出すデータフレームfile
: 書き出すファイルの名前write.csv()
の例CSVファイルの書き出し
## 関数write.csvの使い方
(myData <- subset(airquality,
subset = Ozone>120,
select = -Temp)) # データフレームの作成
dim(myData) # データフレームの大きさを確認
write.csv(myData,file="data/mydata.csv") # csvファイルとして書き出し
Ozone Solar.R Wind Month Day 62 135 269 4.1 7 1 99 122 255 4.0 8 7 117 168 238 3.4 8 25 [1] 3 5
read.csv()
CSVファイルからデータフレームを読み込む
基本書式
read.csv(file="ファイル名", header=TRUE,
row.names, fileEncoding)
file
: 読み込むファイルの名前header
: 1行目を列名として使うか否かrow.names
: 行名の指定fileEncoding
: 文字コードの指定read.csv()
の例CSVファイルの読み込み
## 関数read.csvの使い方
(newdata <- read.csv(file="data/mydata.csv",
row.names=1)) # 1列目を行名に指定
dim(newdata) # 正しく読み込めたか大きさを確認
Ozone Solar.R Wind Month Day 62 135 269 4.1 7 1 99 122 255 4.0 8 7 117 168 238 3.4 8 25 [1] 3 5
save()
RDataファイルへ書き出す
基本書式
save(..., file="ファイル名")
...
: 保存するオブジェクト名file
: 書き出すファイルの名前save()
の例RDataファイルの書き出し
## 関数saveの使い方
(myDat1 <- subset(airquality, Temp>95, select=-Ozone))
(myDat2 <- subset(airquality, Temp<57, select=-Ozone))
dim(myDat1); dim(myDat2) # 大きさを確認
save(myDat1,myDat2,file="data/mydata.rdata") # RData形式で書き出し
Solar.R Wind Temp Month Day 120 203 9.7 97 8 28 122 237 6.3 96 8 30 Solar.R Wind Temp Month Day 5 NA 14.3 56 5 5 [1] 2 5 [1] 1 5
load()
RDataファイルから読み込む
基本書式
load(file="ファイル名")
file
: 読み込むファイルの名前load()
の例## 関数loadの使い方
(myDat1 <- subset(airquality, Ozone > 160)) # 新たに作成
load(file="data/mydata.rdata") # RData形式の読み込み
myDat1 # saveしたときの名前で読み込まれ上書きされる
myDat2
Ozone Solar.R Wind Temp Month Day 117 168 238 3.4 81 8 25 Solar.R Wind Temp Month Day 120 203 9.7 97 8 28 122 237 6.3 96 8 30 Solar.R Wind Temp Month Day 5 NA 14.3 56 5 5
作業ディレクトリに置いて,以下のように読み込む
myData <- read.csv(file="data/jpdata1.csv", fileEncoding="utf8", row.names=1)
myItem <- read.csv(file="data/jpdata2.csv", fileEncoding="utf8")
myArea <- read.csv(file="data/jpdata3.csv", fileEncoding="utf8")
sum()
: 総和mean()
: 平均max()
: 最大値min()
: 最小値練習問題のデータの集計を行う
myData <- read.csv(file="data/jpdata1.csv",
row.names=1, fileEncoding="utf8")
## 一度読み込んでいれば上の行は不要
sum(myData$人口) # 全国の総人口 (列名で選択)
mean(myData[,4]) # 面積の平均値 (行列として列を選択)
median(myData[[4]]) # 面積の中央値 (リストとして列を選択)
min(myData["若年"]) # 若年人口の最小値 (列名で選択)
with(myData,max(老人)) # 老年人口の最大値 (関数withを利用)
[1] 126708000 [1] 793554.5 [1] 609719 [1] 72000 [1] 3160000
apply()
列あるいは行ごとの計算を行う
基本書式
apply(X, MARGIN, FUN)
X
: データフレームMARGIN
: 行(1)か列(2)かを指定FUN
: 計算すべき統計量の関数rowSums()/colSums()
, rowMeans()/colMeans()
apply()
の例抽出したデータの集計を行う
x <- subset(myData, select=婚姻:勤女) # 抽出
colMeans(x) # 各列の平均
apply(x, 2, max) # 列ごとの最大値
sapply(x, max) # 上と同じ (help(sapply)を参照)
## 自作関数の適用 (関数に名前を付けずに利用できる)
apply(x, 2, function(z){sum(z>mean(z))}) # 平均より大きいデータ数
婚姻 離婚 失業 勤男 勤女 4.437021 1.631064 4.221277 410.702128 296.659574 婚姻 離婚 失業 勤男 勤女 6.19 2.41 6.30 444.00 336.00 婚姻 離婚 失業 勤男 勤女 6.19 2.41 6.30 444.00 336.00 婚姻 離婚 失業 勤男 勤女 20 22 25 27 22
aggregate()
各行をグループにまとめて統計量を計算する
基本書式
aggregate(x, by, FUN)
x
: データフレームby
: 各行が属するグループを指定するベクトルをリストで与える(複数可)FUN
: 求めたい統計量を計算するための関数x
がベクトルの場合には関数 tapply()
も利用可)aggregate()
の例 (1/6)同じ値を持つグループごとの平均値を求める
## 人口から面積まで地方ごとの平均値を計算
x <- subset(myData,select=人口:面積)
aggregate(x, by=list(地方=myArea$地方), FUN=mean)
地方 人口 若年 老人 面積 1 関東 6178286 737000.0 1564000.0 463329.3 2 近畿 3204429 395714.3 898714.3 473223.6 3 九州 1795000 243875.0 511000.0 556395.0 4 四国 947000 112250.0 305750.0 470091.5 5 中国 1473800 186400.0 448600.0 638433.4 6 中部 2372889 302888.9 667555.6 742297.6 7 東北 1472667 169333.3 452666.7 1115790.7 8 北海道 5320000 588000.0 1632000.0 7842078.0
aggregate()
の例 (2/6)代入せずにまとめて書くことも可能
aggregate(subset(myData,select=人口:面積),
by=list(地方=myArea$地方),
FUN=mean)
地方 人口 若年 老人 面積 1 関東 6178286 737000.0 1564000.0 463329.3 2 近畿 3204429 395714.3 898714.3 473223.6 3 九州 1795000 243875.0 511000.0 556395.0 4 四国 947000 112250.0 305750.0 470091.5 5 中国 1473800 186400.0 448600.0 638433.4 6 中部 2372889 302888.9 667555.6 742297.6 7 東北 1472667 169333.3 452666.7 1115790.7 8 北海道 5320000 588000.0 1632000.0 7842078.0
aggregate()
の例 (3/6)以下も同じ結果を返す
y <- data.frame(x,地方=myArea$地方)
aggregate( . ~ 地方, data=y, FUN=mean)
地方 人口 若年 老人 面積 1 関東 6178286 737000.0 1564000.0 463329.3 2 近畿 3204429 395714.3 898714.3 473223.6 3 九州 1795000 243875.0 511000.0 556395.0 4 四国 947000 112250.0 305750.0 470091.5 5 中国 1473800 186400.0 448600.0 638433.4 6 中部 2372889 302888.9 667555.6 742297.6 7 東北 1472667 169333.3 452666.7 1115790.7 8 北海道 5320000 588000.0 1632000.0 7842078.0
aggregate()
の例 (4/6)まとめて書くことも可能
aggregate( . ~ 地方, # 右辺で条件付けて左辺(右辺以外)を計算
data=data.frame(subset(myData,select=人口:面積),
地方=myArea$地方),
FUN=mean)
地方 人口 若年 老人 面積 1 関東 6178286 737000.0 1564000.0 463329.3 2 近畿 3204429 395714.3 898714.3 473223.6 3 九州 1795000 243875.0 511000.0 556395.0 4 四国 947000 112250.0 305750.0 470091.5 5 中国 1473800 186400.0 448600.0 638433.4 6 中部 2372889 302888.9 667555.6 742297.6 7 東北 1472667 169333.3 452666.7 1115790.7 8 北海道 5320000 588000.0 1632000.0 7842078.0
aggregate()
の例 (5/6)複数の条件でグループ分け
## 地方と,人口が中央値以下か否かでグループ分けして平均値を計算
aggregate(x, by=list(地方=myArea$地方,
過疎=with(myData, 人口<=median(人口))),
FUN=mean)
地方 過疎 人口 若年 老人 面積 1 関東 FALSE 6178285.7 737000.0 1564000.0 463329.3 2 近畿 FALSE 4681250.0 573750.0 1305500.0 517317.2 3 九州 FALSE 3436000.0 456000.0 957500.0 619800.0 4 中国 FALSE 2368000.0 305500.0 688000.0 779697.5 5 中部 FALSE 3510200.0 451400.0 973200.0 994346.8 6 東北 FALSE 2102500.0 250000.0 600000.0 1053306.0 7 北海道 FALSE 5320000.0 588000.0 1632000.0 7842078.0 8 近畿 TRUE 1235333.3 158333.3 356333.3 414432.0 9 九州 TRUE 1248000.0 173166.7 362166.7 535260.0 10 四国 TRUE 947000.0 112250.0 305750.0 470091.5 11 中国 TRUE 877666.7 107000.0 289000.0 544257.3 12 中部 TRUE 951250.0 117250.0 285500.0 427236.0 13 東北 TRUE 1157750.0 129000.0 379000.0 1147033.0
aggregate()
の例 (6/6)別の書き方
aggregate( . ~ 地方 + 過疎, FUN=mean, # + で条件を追加
data=data.frame(subset(myData,select=人口:面積),
地方=myArea$地方,
過疎=with(myData, 人口<=median(人口))))
地方 過疎 人口 若年 老人 面積 1 関東 FALSE 6178285.7 737000.0 1564000.0 463329.3 2 近畿 FALSE 4681250.0 573750.0 1305500.0 517317.2 3 九州 FALSE 3436000.0 456000.0 957500.0 619800.0 4 中国 FALSE 2368000.0 305500.0 688000.0 779697.5 5 中部 FALSE 3510200.0 451400.0 973200.0 994346.8 6 東北 FALSE 2102500.0 250000.0 600000.0 1053306.0 7 北海道 FALSE 5320000.0 588000.0 1632000.0 7842078.0 8 近畿 TRUE 1235333.3 158333.3 356333.3 414432.0 9 九州 TRUE 1248000.0 173166.7 362166.7 535260.0 10 四国 TRUE 947000.0 112250.0 305750.0 470091.5 11 中国 TRUE 877666.7 107000.0 289000.0 544257.3 12 中部 TRUE 951250.0 117250.0 285500.0 427236.0 13 東北 TRUE 1157750.0 129000.0 379000.0 1147033.0
サンプルデータ(jpdata)の整理をしてみよう.