第4章の内容

4.1 エクセルを使ってメタデータをまとめる

#メタデータの取り込み
phyto_metadata <- read.csv("metadata_phyto.csv", header = T) #load file list
#読み込まれた内容の確認
phyto_metadata
#年月日に何種類あるか、一覧を確認
levels(as.factor(phyto_metadata$YYMMDD))
[1] "D180316" "D181004" "D181025" "D190425" "D190520"
##年月日に何種類あるか、その種類数を計算
length(levels(as.factor(phyto_metadata$YYMMDD)))
[1] 5

4.2 Rプログラミングの基礎(if, loop, 関数)

https://tksmiki.github.io/test_R/chapter04_05/chapter04_4-2.nb.html

4.3 メタデータを活用した大量のデータの自動読み込み

植物プランクトンの種組成データを読み込む

#ファイル名の一覧を確認してみる。
phyto_metadata$file
 [1] "20180316_1_ryuko.csv" "20180316_2_ryuko.csv" "20181004_1_ryuko.csv"
 [4] "20181004_2_ryuko.csv" "20181004_3_ryuko.csv" "20181025_1_ryuko.csv"
 [7] "20181025_2_ryuko.csv" "20190425_1_ryuko.csv" "20190425_2_ryuko.csv"
[10] "20190425_3_ryuko.csv" "20190425_4_ryuko.csv" "20190425_5_ryuko.csv"
[13] "20190520_1_ryuko.csv" "20190520_2_ryuko.csv" "20190520_3_ryuko.csv"
####load each data###############
#空のリストを生成する
raw_data <- list() #prepare empty list
#必要なファイル数をlength()関数を使って計算し, no_sampleに代入する
no_sample <- length(phyto_metadata$file)
for(i in 1:no_sample) {#1からno_sampleまでループを繰り返す
  print(i) #今何番目のループかがわかるようにiの値をコンソールに出力する
  #phyto_metadata$fileベクトルの各要素からファイル名を指定してデータを読み込み,リストの各要素に代入していく
  raw_data[[i]] <- read.csv(as.character(phyto_metadata$file[i]), header = T)
}
[1] 1
[1] 2
[1] 3
[1] 4
[1] 5
[1] 6
[1] 7
[1] 8
[1] 9
[1] 10
[1] 11
[1] 12
[1] 13
[1] 14
[1] 15

読み込まれたリストの3番目の要素について,その冒頭部分だけをhead()関数を使って確認してみる

head(raw_data[[3]])

全体を確認してもよい

raw_data[[3]]

ここから第5章の内容

5.1.1 エクセルを用いたデータ保存での保存形式のミス

エラーが起きるように意図したメタデータファイルを読み込んでエラーを再現

###For Chapter 5: Section 5.1#######
phyto_metadata <- read.csv("metadata_phyto_e1.csv", header = T) #load file list

Rのバージョンが古いときのみ、次のfor loopでエラーが生じる

####load each data###############
raw_data <- list() #prepare empty list
no_sample <- length(phyto_metadata$file)
for(i in 1:no_sample) {
  print(i)
  raw_data[[i]] <- read.csv(as.character(phyto_metadata$file[i]), header = T)
}
[1] 1
[1] 2
[1] 3
Error in make.names(col.names, unique = TRUE) : 
  invalid multibyte string at '<ef>サ<bf>type'

エラーが起きている3番目のファイルは何?

phyto_metadata$file[3]
[1] "20181004_1_ryuko_e1.csv"

“20181004_1_ryuko_e1.csv”の保存形式を「CSV(コンマ区切り)(*.csv)」に変えたのちもう一度ファイルを読み込む

for(i in 1:no_sample) {
  print(i)
  raw_data[[i]] <- read.csv(as.character(phyto_metadata$file[i]), header = T)
}
[1] 1
[1] 2
[1] 3
[1] 4
[1] 5
[1] 6
[1] 7
[1] 8
[1] 9
[1] 10
[1] 11
[1] 12
[1] 13
[1] 14
[1] 15

5.1.2 エクセルにデータを整理した時に余分な行や列が追加されてしまうミス

データ読み込み先であるraw_data(リスト)の5番目がおかしいことに気付くはず(意図的なエラー)

raw_data[[5]]

37行目と4列目を取り除き[-37, -4], 取り除いたものを上書きすればよい

raw_data[[5]] <- raw_data[[5]][-37, -4]
raw_data[[5]] #上書き後のデータを確認

5.2.1に進む前に

もしもいろいろ自分でコードの実行を試してオブジェクトの中身が変わってしまった場合、以下のコードをコンソールで実行すれば著者が意図したオブジェクトを使って、5.2.1以降のプランクトンデータの整頓ができます

raw_data <- readRDS("plankton_data.obj")

5.2.1 プランクトンデータを整頓する

名前の付け替え

######For Section 5.2.1############### 
#change colnames
for(i in 1:length(phyto_metadata$file)) {
  colnames(raw_data[[i]])[3] <- as.character(phyto_metadata$file[i])
}

小さなエラー処理:種名に余分なスペースが入っている

raw_data[[6]]$species[16]
[1] " Microcystis viridis"

冒頭のスペースを削除する

raw_data[[6]]$species[16] <- "Microcystis viridis"

データのマージ

リストraw_dataの要素1と要素2をマージする。ただし一列目は不要なので[, c(-1)]で削除する

merged_data <- merge(raw_data[[1]][,c(-1)], raw_data[[2]][,c(-1)], all = T)

上の作業をループで繰り返してすべてマージする。ループの開始点(i = 3)に注意

#looping merge
for(i in 3:length(phyto_metadata$file)) {
  merged_data <- merge(merged_data, raw_data[[i]][,c(-1)], all = T)
}

マージ後のデータを確認

View(merged_data)
head(merged_data)

マージしたデータの整頓

NAをゼロに置き換える

#convert all NA to zero 全てのNAをゼロに置き換える
merged_data[is.na(merged_data)] <- 0
#置き換え後のデータの確認
head(merged_data)

データの整頓

#copy dataframe to new dataframe #"merged_data"をこれ以上いじらないように別の名前のオブジェクトに内容をコピーする
species_ryuko_data <- merged_data
#copy species name to row names
#種名を行名に代入する
rownames(species_ryuko_data) <- species_ryuko_data$species
#remove the redundant info
#一列目と行名の内容が同じ(=冗長, redundant)なので、一列目を削除して同じオブジェクトに上書き
species_ryuko_data <- species_ryuko_data[,-1]

#transpose tidy形式のデータにするため行と列を入れ替える
species_ryuko_data <- as.data.frame(t(species_ryuko_data))

整頓後のデータの確認

View(species_ryuko_data)
head(species_ryuko_data)
#check class, ちゃんと個体数が数値(numeric)として認識されているかを確認する
class(species_ryuko_data[,2])
[1] "numeric"
LS0tDQp0aXRsZTogInBoeXRvX3Rlc3QuUuOBq+WvvuW/nOOBl+OBn1IgTm90ZWJvb2siDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KIyMg56ysNOeroOOBruWGheWuuQ0KIyMjIDQuMSDjgqjjgq/jgrvjg6vjgpLkvb/jgaPjgabjg6Hjgr/jg4fjg7zjgr/jgpLjgb7jgajjgoHjgosNCmBgYHtyfQ0KI+ODoeOCv+ODh+ODvOOCv+OBruWPluOCiui+vOOBvw0KcGh5dG9fbWV0YWRhdGEgPC0gcmVhZC5jc3YoIm1ldGFkYXRhX3BoeXRvLmNzdiIsIGhlYWRlciA9IFQpICNsb2FkIGZpbGUgbGlzdA0KI+iqreOBv+i+vOOBvuOCjOOBn+WGheWuueOBrueiuuiqjQ0KcGh5dG9fbWV0YWRhdGENCmBgYA0KDQpgYGB7cn0NCiPlubTmnIjml6XjgavkvZXnqK7poZ7jgYLjgovjgYvjgIHkuIDopqfjgpLnorroqo0NCmxldmVscyhhcy5mYWN0b3IocGh5dG9fbWV0YWRhdGEkWVlNTUREKSkNCiMj5bm05pyI5pel44Gr5L2V56iu6aGe44GC44KL44GL44CB44Gd44Gu56iu6aGe5pWw44KS6KiI566XDQpsZW5ndGgobGV2ZWxzKGFzLmZhY3RvcihwaHl0b19tZXRhZGF0YSRZWU1NREQpKSkNCmBgYA0KIyMjIDQuMiBS44OX44Ot44Kw44Op44Of44Oz44Kw44Gu5Z+656SOKGlmLCBsb29wLCDplqLmlbApDQpodHRwczovL3Rrc21pa2kuZ2l0aHViLmlvL3Rlc3RfUi9jaGFwdGVyMDRfMDUvY2hhcHRlcjA0XzQtMi5uYi5odG1sDQoNCiMjIyA0LjMg44Oh44K/44OH44O844K/44KS5rS755So44GX44Gf5aSn6YeP44Gu44OH44O844K/44Gu6Ieq5YuV6Kqt44G/6L6844G/DQrmpI3nianjg5fjg6njg7Pjgq/jg4jjg7Pjga7nqK7ntYTmiJDjg4fjg7zjgr/jgpLoqq3jgb/ovrzjgoANCmBgYHtyfQ0KI+ODleOCoeOCpOODq+WQjeOBruS4gOimp+OCkueiuuiqjeOBl+OBpuOBv+OCi+OAgg0KcGh5dG9fbWV0YWRhdGEkZmlsZQ0KIyMjI2xvYWQgZWFjaCBkYXRhIyMjIyMjIyMjIyMjIyMjDQoj56m644Gu44Oq44K544OI44KS55Sf5oiQ44GZ44KLDQpyYXdfZGF0YSA8LSBsaXN0KCkgI3ByZXBhcmUgZW1wdHkgbGlzdA0KI+W/heimgeOBquODleOCoeOCpOODq+aVsOOCkmxlbmd0aCgp6Zai5pWw44KS5L2/44Gj44Gm6KiI566X44GXLCBub19zYW1wbGXjgavku6PlhaXjgZnjgosNCm5vX3NhbXBsZSA8LSBsZW5ndGgocGh5dG9fbWV0YWRhdGEkZmlsZSkNCmZvcihpIGluIDE6bm9fc2FtcGxlKSB7I++8keOBi+OCiW5vX3NhbXBsZeOBvuOBp+ODq+ODvOODl+OCkue5sOOCiui/lOOBmQ0KICBwcmludChpKeOAgCPku4rkvZXnlarnm67jga7jg6vjg7zjg5fjgYvjgYzjgo/jgYvjgovjgojjgYbjgatp44Gu5YCk44KS44Kz44Oz44K944O844Or44Gr5Ye65Yqb44GZ44KLDQogICNwaHl0b19tZXRhZGF0YSRmaWxl44OZ44Kv44OI44Or44Gu5ZCE6KaB57Sg44GL44KJ44OV44Kh44Kk44Or5ZCN44KS5oyH5a6a44GX44Gm44OH44O844K/44KS6Kqt44G/6L6844G/77yM44Oq44K544OI44Gu5ZCE6KaB57Sg44Gr5Luj5YWl44GX44Gm44GE44GPDQogIHJhd19kYXRhW1tpXV0gPC0gcmVhZC5jc3YoYXMuY2hhcmFjdGVyKHBoeXRvX21ldGFkYXRhJGZpbGVbaV0pLCBoZWFkZXIgPSBUKQ0KfQ0KYGBgDQroqq3jgb/ovrzjgb7jgozjgZ/jg6rjgrnjg4jjga4z55Wq55uu44Gu6KaB57Sg44Gr44Gk44GE44Gm77yM44Gd44Gu5YaS6aCt6YOo5YiG44Gg44GR44KSaGVhZCgp6Zai5pWw44KS5L2/44Gj44Gm56K66KqN44GX44Gm44G/44KLDQpgYGB7cn0NCmhlYWQocmF3X2RhdGFbWzNdXSkNCmBgYA0K5YWo5L2T44KS56K66KqN44GX44Gm44KC44KI44GEDQpgYGB7cn0NCnJhd19kYXRhW1szXV0NCmBgYA0KDQojIyDjgZPjgZPjgYvjgonnrKw156ug44Gu5YaF5a65DQojIyMgNS4xLjEg44Ko44Kv44K744Or44KS55So44GE44Gf44OH44O844K/5L+d5a2Y44Gn44Gu5L+d5a2Y5b2i5byP44Gu44Of44K5DQoNCuOCqOODqeODvOOBjOi1t+OBjeOCi+OCiOOBhuOBq+aEj+Wbs+OBl+OBn+ODoeOCv+ODh+ODvOOCv+ODleOCoeOCpOODq+OCkuiqreOBv+i+vOOCk+OBp+OCqOODqeODvOOCkuWGjeePvg0KYGBge3J9DQojIyNGb3IgQ2hhcHRlciA1OiBTZWN0aW9uIDUuMSMjIyMjIyMNCnBoeXRvX21ldGFkYXRhIDwtIHJlYWQuY3N2KCJtZXRhZGF0YV9waHl0b19lMS5jc3YiLCBoZWFkZXIgPSBUKSAjbG9hZCBmaWxlIGxpc3QNCmBgYA0KDQpS44Gu44OQ44O844K444On44Oz44GM5Y+k44GE44Go44GN44Gu44G/44CB5qyh44GuZm9yIGxvb3Djgafjgqjjg6njg7zjgYznlJ/jgZjjgosNCmBgYHtyIGVycm9yID0gVFJVRX0NCiMjIyNsb2FkIGVhY2ggZGF0YSMjIyMjIyMjIyMjIyMjIw0KcmF3X2RhdGEgPC0gbGlzdCgpICNwcmVwYXJlIGVtcHR5IGxpc3QNCm5vX3NhbXBsZSA8LSBsZW5ndGgocGh5dG9fbWV0YWRhdGEkZmlsZSkNCmZvcihpIGluIDE6bm9fc2FtcGxlKSB7DQogIHByaW50KGkpDQogIHJhd19kYXRhW1tpXV0gPC0gcmVhZC5jc3YoYXMuY2hhcmFjdGVyKHBoeXRvX21ldGFkYXRhJGZpbGVbaV0pLCBoZWFkZXIgPSBUKQ0KfQ0KYGBgDQrjgqjjg6njg7zjgYzotbfjgY3jgabjgYTjgosz55Wq55uu44Gu44OV44Kh44Kk44Or44Gv5L2V77yfDQpgYGB7cn0NCnBoeXRvX21ldGFkYXRhJGZpbGVbM10NCmBgYA0KIjIwMTgxMDA0XzFfcnl1a29fZTEuY3N2IuOBruS/neWtmOW9ouW8j+OCkuOAjENTVijjgrPjg7Pjg57ljLrliIfjgoopKCouY3N2KeOAjeOBq+WkieOBiOOBn+OBruOBoeOCguOBhuS4gOW6puODleOCoeOCpOODq+OCkuiqreOBv+i+vOOCgA0KYGBge3J9DQpmb3IoaSBpbiAxOm5vX3NhbXBsZSkgew0KICBwcmludChpKQ0KICByYXdfZGF0YVtbaV1dIDwtIHJlYWQuY3N2KGFzLmNoYXJhY3RlcihwaHl0b19tZXRhZGF0YSRmaWxlW2ldKSwgaGVhZGVyID0gVCkNCn0NCmBgYA0KIyMjIDUuMS4yIOOCqOOCr+OCu+ODq+OBq+ODh+ODvOOCv+OCkuaVtOeQhuOBl+OBn+aZguOBq+S9meWIhuOBquihjOOChOWIl+OBjOi/veWKoOOBleOCjOOBpuOBl+OBvuOBhuODn+OCuQ0KDQrjg4fjg7zjgr/oqq3jgb/ovrzjgb/lhYjjgafjgYLjgotyYXdfZGF0YSjjg6rjgrnjg4gp44GuNeeVquebruOBjOOBiuOBi+OBl+OBhOOBk+OBqOOBq+awl+S7mOOBj+OBr+OBmu+8iOaEj+Wbs+eahOOBquOCqOODqeODvO+8iQ0KYGBge3J9DQpyYXdfZGF0YVtbNV1dDQpgYGANCjM36KGM55uu44GoNOWIl+ebruOCkuWPluOCiumZpOOBjVstMzcsIC00XSwg5Y+W44KK6Zmk44GE44Gf44KC44Gu44KS5LiK5pu444GN44GZ44KM44Gw44KI44GEDQpgYGB7cn0NCnJhd19kYXRhW1s1XV0gPC0gcmF3X2RhdGFbWzVdXVstMzcsIC00XQ0KcmF3X2RhdGFbWzVdXSAj5LiK5pu444GN5b6M44Gu44OH44O844K/44KS56K66KqNDQpgYGANCiMjIyA1LjIuMeOBq+mAsuOCgOWJjeOBqw0K44KC44GX44KC44GE44KN44GE44KN6Ieq5YiG44Gn44Kz44O844OJ44Gu5a6f6KGM44KS6Kmm44GX44Gm44Kq44OW44K444Kn44Kv44OI44Gu5Lit6Lqr44GM5aSJ44KP44Gj44Gm44GX44G+44Gj44Gf5aC05ZCI44CB5Lul5LiL44Gu44Kz44O844OJ44KS44Kz44Oz44K944O844Or44Gn5a6f6KGM44GZ44KM44Gw6JGX6ICF44GM5oSP5Zuz44GX44Gf44Kq44OW44K444Kn44Kv44OI44KS5L2/44Gj44Gm44CBNS4yLjHku6XpmY3jga7jg5fjg6njg7Pjgq/jg4jjg7Pjg4fjg7zjgr/jga7mlbTpoJPjgYzjgafjgY3jgb7jgZkNCmBgYHtyfQ0KcmF3X2RhdGEgPC0gcmVhZFJEUygicGxhbmt0b25fZGF0YS5vYmoiKQ0KYGBgDQoNCiMjIyA1LjIuMSDjg5fjg6njg7Pjgq/jg4jjg7Pjg4fjg7zjgr/jgpLmlbTpoJPjgZnjgosNCiMjIyMg5ZCN5YmN44Gu5LuY44GR5pu/44GIDQpgYGB7cn0NCiMjIyMjI0ZvciBTZWN0aW9uIDUuMi4xIyMjIyMjIyMjIyMjIyMjIA0KI2NoYW5nZSBjb2xuYW1lcw0KZm9yKGkgaW4gMTpsZW5ndGgocGh5dG9fbWV0YWRhdGEkZmlsZSkpIHsNCiAgY29sbmFtZXMocmF3X2RhdGFbW2ldXSlbM10gPC0gYXMuY2hhcmFjdGVyKHBoeXRvX21ldGFkYXRhJGZpbGVbaV0pDQp9DQpgYGANCiMjIyMg5bCP44GV44Gq44Ko44Op44O85Yem55CG77ya56iu5ZCN44Gr5L2Z5YiG44Gq44K544Oa44O844K544GM5YWl44Gj44Gm44GE44KLDQpgYGB7cn0NCnJhd19kYXRhW1s2XV0kc3BlY2llc1sxNl0NCmBgYA0K5YaS6aCt44Gu44K544Oa44O844K544KS5YmK6Zmk44GZ44KLDQpgYGB7cn0NCnJhd19kYXRhW1s2XV0kc3BlY2llc1sxNl0gPC0gIk1pY3JvY3lzdGlzIHZpcmlkaXMiDQpgYGANCg0KIyMjIyDjg4fjg7zjgr/jga7jg57jg7zjgrgNCuODquOCueODiHJhd19kYXRh44Gu6KaB57Sg77yR44Go6KaB57Sg77yS44KS44Oe44O844K444GZ44KL44CC44Gf44Gg44GX5LiA5YiX55uu44Gv5LiN6KaB44Gq44Gu44GnWywgYygtMSld44Gn5YmK6Zmk44GZ44KLDQpgYGB7cn0NCm1lcmdlZF9kYXRhIDwtIG1lcmdlKHJhd19kYXRhW1sxXV1bLGMoLTEpXSwgcmF3X2RhdGFbWzJdXVssYygtMSldLCBhbGwgPSBUKQ0KYGBgDQrkuIrjga7kvZzmpa3jgpLjg6vjg7zjg5fjgafnubDjgorov5TjgZfjgabjgZnjgbnjgabjg57jg7zjgrjjgZnjgovjgILjg6vjg7zjg5fjga7plovlp4vngrkoaSA9IDMp44Gr5rOo5oSPDQpgYGB7cn0NCiNsb29waW5nIG1lcmdlDQpmb3IoaSBpbiAzOmxlbmd0aChwaHl0b19tZXRhZGF0YSRmaWxlKSkgew0KICBtZXJnZWRfZGF0YSA8LSBtZXJnZShtZXJnZWRfZGF0YSwgcmF3X2RhdGFbW2ldXVssYygtMSldLCBhbGwgPSBUKQ0KfQ0KYGBgDQrjg57jg7zjgrjlvozjga7jg4fjg7zjgr/jgpLnorroqo0NCmBgYHtyfQ0KVmlldyhtZXJnZWRfZGF0YSkNCmhlYWQobWVyZ2VkX2RhdGEpDQpgYGANCiMjIyMg44Oe44O844K444GX44Gf44OH44O844K/44Gu5pW06aCTDQpOQeOCkuOCvOODreOBq+e9ruOBjeaPm+OBiOOCiw0KYGBge3J9DQojY29udmVydCBhbGwgTkEgdG8gemVyb+OAgOWFqOOBpuOBrk5B44KS44K844Ot44Gr572u44GN5o+b44GI44KLDQptZXJnZWRfZGF0YVtpcy5uYShtZXJnZWRfZGF0YSldIDwtIDANCiPnva7jgY3mj5vjgYjlvozjga7jg4fjg7zjgr/jga7norroqo0NCmhlYWQobWVyZ2VkX2RhdGEpDQpgYGANCg0K44OH44O844K/44Gu5pW06aCTDQpgYGB7cn0NCiNjb3B5IGRhdGFmcmFtZSB0byBuZXcgZGF0YWZyYW1lICMibWVyZ2VkX2RhdGEi44KS44GT44KM5Lul5LiK44GE44GY44KJ44Gq44GE44KI44GG44Gr5Yil44Gu5ZCN5YmN44Gu44Kq44OW44K444Kn44Kv44OI44Gr5YaF5a6544KS44Kz44OU44O844GZ44KLDQpzcGVjaWVzX3J5dWtvX2RhdGEgPC0gbWVyZ2VkX2RhdGENCiNjb3B5IHNwZWNpZXMgbmFtZSB0byByb3cgbmFtZXMNCiPnqK7lkI3jgpLooYzlkI3jgavku6PlhaXjgZnjgosNCnJvd25hbWVzKHNwZWNpZXNfcnl1a29fZGF0YSkgPC0gc3BlY2llc19yeXVrb19kYXRhJHNwZWNpZXMNCiNyZW1vdmUgdGhlIHJlZHVuZGFudCBpbmZvDQoj5LiA5YiX55uu44Go6KGM5ZCN44Gu5YaF5a6544GM5ZCM44GYKD3lhpfplbcsIHJlZHVuZGFudCnjgarjga7jgafjgIHkuIDliJfnm67jgpLliYrpmaTjgZfjgablkIzjgZjjgqrjg5bjgrjjgqfjgq/jg4jjgavkuIrmm7jjgY0NCnNwZWNpZXNfcnl1a29fZGF0YSA8LSBzcGVjaWVzX3J5dWtvX2RhdGFbLC0xXQ0KDQojdHJhbnNwb3Nl44CAdGlkeeW9ouW8j+OBruODh+ODvOOCv+OBq+OBmeOCi+OBn+OCgeihjOOBqOWIl+OCkuWFpeOCjOabv+OBiOOCiw0Kc3BlY2llc19yeXVrb19kYXRhIDwtIGFzLmRhdGEuZnJhbWUodChzcGVjaWVzX3J5dWtvX2RhdGEpKQ0KYGBgDQrmlbTpoJPlvozjga7jg4fjg7zjgr/jga7norroqo0NCmBgYHtyfQ0KVmlldyhzcGVjaWVzX3J5dWtvX2RhdGEpDQpoZWFkKHNwZWNpZXNfcnl1a29fZGF0YSkNCiNjaGVjayBjbGFzcywg44Gh44KD44KT44Go5YCL5L2T5pWw44GM5pWw5YCkKG51bWVyaWMp44Go44GX44Gm6KqN6K2Y44GV44KM44Gm44GE44KL44GL44KS56K66KqN44GZ44KLDQpjbGFzcyhzcGVjaWVzX3J5dWtvX2RhdGFbLDJdKQ0KYGBgDQoNCg0KDQo=