プログラミング覚書(R)
tidyverseの機能を中心した書き方は、作業手順をコードから理解しやすい。欠損値や文字列が扱いやすくデータ整理型の作業に向いている。データ整理に便利なツールが多く、便利な道具を使いこなすという趣向は、ユーザーレベルで材料がシンプルなFORTRAN系の言語(MatlabやJulia)とは相互補完的に有用であるように感じられる。赤は特に便利だと思った機能を示す。
zooを使い小さいギャップのみ補完する方法 (他の言語では”小さいギャップのみ”という制約が面倒になる。ただしデータが等間隔に並んでいる必要あり)
library(zoo)
....
newta = na.approx(ta, rule=2, method = "linear", maxgap=2) #ここでは最大2連続のギャップを許容
複数のカテゴリーでfor loopを回す代わりにmap_dfr (村上さんから教わった技法: 以下は季節・サイトごとに変数Eに対してその初期値を差し引く作業)
newdata <- data %>%
group_by(season, site) %>%
group_split() %>%
map_dfr(function(df){
Einitial = df$E[1]
df %>% mutate(E = E - Einitial)
%>% ungroup()
lubridateを使った時間データ処理
library(lubridate)で時間要素の抽出(Matlabのdatenumと似た使用はas.POSIXctを使う)
mutate(TIMESTAMP = ymd_hm(TIMESTAMP), day = day(TIMESTAMP), hour = hour(TIMESTAMP), doy = yday(TIMESTAMP))
時間軸のことなるデータを合わせる(yearとdoyという変数を基準として)
dataC <- left_join(dataA, dataB, by = c("year", "doy")
時間の要素から時間の変数を作成
timestamp = make_datetime(year, month, day, hour, mins)
時間分解の細かいデータを30分ごとに平均し、エンドタイムでまとめる
data_30min <- data_1min %>%
mutate(timestamp_tmp = ymd_hms(TIMESTAMP)) %>%
mutate(TIMESTAMP_ceil = ceiling_date(timestamp_tmp, unit = "30 mins")) %>%
group_by(TIMESTAMP_ceil) %>%
summarise_if(is.numeric, mean, na.rm=TRUE)
tidyverseに必須のpivot_longer & pivot_wider
サブグループのみに対してpivot_longerを使う場合。メイングループとサブグループの情報を(e.g., 地上高度11mで記録した気温ta_11)_(underscore)で連結させておく。
pivot_longer(cols=c("ta_11","ta_02","rh_11","rh_02"), names_sep ="_", names_to = c("metvariable","position"), values_to = c("value")) %>%
pivot_wider(names_from = "obsvariable", values_from = "value")
データ操作一般
データをソートする
T <- T %>% arrange(REPS, CHAMBER)
変数の序列を指定する
... mutate(variable = factor(variable, levels = c("Y", "X"))
Stringにアルファベット順でない順番をつける。
TIME = factor(TIME, levels=c("Morning","Noon","Evening"))
特定の名前に該当する列を抽出する
fnd = str_c(datalist$varname, collapse = "|")
trimmeddata = alldata[str_detect(alldata$allname, fnd), ]
列(column)を選択するには
T <- T %>%
select( columnA )
パターン検索にはgrepを使う。データフレームTのOs数字で始まる行(row)を検索
T <- T[ grep("Os[0-9]", rownames(T) ), ]
列(column)を削除するには
T <- T %>%
select( -columnA )
行(row)を選択するには
T <- T %>%
filter(condition )
新しい変数を条件付きで
T <- T %>%
mutate(newcolumnA = ifelse(columnA > 1, 1, 0)) # columnA が1より大きければ1そうでなければ0
配列を式で書くときはカッコをつける
T[a + 1 : b -1] ではなくT[(a + 1) : ( b -1)]
カラムの変数名を変えるときは
T <- T%>%
rename(columnB = columnA)
中心差分を取る方法
dA = diff(rollmean(A, k = 2))
端を工夫(一例)して同じ列数にする
dA = c((A[2]-A[1])/2, diff(rollmean(A, k = 2)), diff(tail(A, n = 2))))
基本操作&設定
現在のディレクトリーを表示
getwd()
ディレクトリーを指定
setwd()
functionを他のファイルから読む
source("C:/Users/xxx.R")
Rのデータフォーマットで保存(Rはデータの入出力が楽なのでcsvやtxtを仲介させる方がよいか)
save(tidydata, file = "tidydata.rda")
NAを無視した平均
mean(T$variable, na.rm = TRUE)
Rmdで日本語が表示されない(File > Save with Encoding > UTF-8)
データをcsvファイルで保存 readr::write_excel_csv(data "xxx.csv")
カラーテーマはPastel on Darkがよさそう