チラシの裏の落書き日記

統計とか,研究とか,日常についての備忘録的なもの。

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パッケージにはまだ良くわかってない使い方があるので,今後もまた調べていきたいところ。