自分用メモ

data.frameのNAを0に置換

バイト中にテキストの処理とかそういうの代わりにRを使っていたんだけど、さっと出てこないで自分にむかついたので、メモしておく。こんな行列があったとする(本当はdata.frameだったんだが、まあほとんど一緒)。NAを0に置き換えるというよくありがちな作業。

> matrix(c(NA,2,3,4,NA,4,1,NA),2,4)
     [,1] [,2] [,3] [,4]
[1,]   NA    3   NA    1
[2,]    2    4    4   NA

こんな感じでやってみた。replaceとかでどうにか、とか思ったがなんかうまくいかんだった。ifelseが条件とかではなく、関数というのは常識ですね。

> apply(matrix(c(NA,2,3,4,NA,4,1,NA),2,4),2,function(x){ifelse(is.na(x),0,x)})
     [,1] [,2] [,3] [,4]
[1,]    0    3    0    1
[2,]    2    4    4    0

data.frameをベクトルが要素のリストに変換

自分で書いたやつ。

> unlist(apply(matrix(seq(12),3,4),2,list),recursive=F)
[[1]]
[1] 1 2 3

[[2]]
[1] 4 5 6

[[3]]
[1] 7 8 9

[[4]]
[1] 10 11 12

id:ichanさんにtwitterで教えてもらったもの。

> as.list(data.frame(t(matrix(seq(12),3,4))))
$X1
[1]  1  4  7 10

$X2
[1]  2  5  8 11

$X3
[1]  3  6  9 12

timelineに流れていた@arboresさんのコード

> m<-lapply(1:3,function(x) matrix((1:9)*x,nrow=3))
> m
[[1]]
     [,1] [,2] [,3]
[1,]    1    4    7
[2,]    2    5    8
[3,]    3    6    9

[[2]]
     [,1] [,2] [,3]
[1,]    2    8   14
[2,]    4   10   16
[3,]    6   12   18

[[3]]
     [,1] [,2] [,3]
[1,]    3   12   21
[2,]    6   15   24
[3,]    9   18   27

> matrix(unlist(t(m)), nrow=3, byrow=T) 
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
[1,]    1    2    3    4    5    6    7    8    9
[2,]    2    4    6    8   10   12   14   16   18
[3,]    3    6    9   12   15   18   21   24   27

> matrix(unlist(m), nrow=3) 
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
[1,]    1    4    7    2    8   14    3   12   21
[2,]    2    5    8    4   10   16    6   15   24
[3,]    3    6    9    6   12   18    9   18   27