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