プログラミング覚書(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がよさそう