list操作めも
Rのリスト操作について改めてまとめる。
特に,purrrなどを用いた操作を理解すること。
purrrの使い方についてのページ
purrr: ループ処理やapply系関数の決定版 - Heavy Watal
Hadley神のListについてのページ
Lists · R for Data Science
forループ的なlapplyやらmapの使い方が便利。
forループを使う場合には,
df <- df <- data.frame( a = rnorm(10), b = rnorm(10), c = rnorm(10), d = rnorm(10) ) temp <- numeric(length(df)) for(i in 1:length(df)){ temp[i] <- mean(df[[i]]) } temp
などと事前に結果を入れるオブジェクトを容易しないといけない。
一方,lapplyやsapplyを使うと,わりと簡潔に書ける。
lapply(df, mean) sapply(df, mean)
purrrパッケージのmapなどはlapplyを今風に処理するためのもの。
map_dfなどは型を指定して,結果をベクトルで返すもの。結果はベクトルなので注意。
library("purrr") map(df,mean) map_dbl(df, mean) map_df(df, mean)
さらに,mapやlapplyをforループ的に使うこともできる。これは言われれば納得だが,知らないと確かに書けない。今後使って行きたい。
# for loop的な使い方 map(1:3, ~df[,.]) map(1:5, runif)
また,特定の条件を満たす要素に関数を適用する,map_ifとmap_atも地味に便利。
# 0より大きい要素に対して,なんか処理をする。 -2:2 %>% map_if(.,.>0, as.factor) # 部分的に適用して,残りのリスト全体を返す。 ? map_if iris %>% map_if(is.factor, as.character) %>% str() # 全部数値 mtcars %>% str() # 1,4,5列画文字に mtcars %>% map_at(c(1, 4, 5), as.character) %>% str()
purrrパッケージにはまだ良くわかってない使い方があるので,今後もまた調べていきたいところ。