R_sapply の変更点 - アールメカブ

アールメカブ


R_sapply の変更点


[[Rの備忘録]]



[[RjpWiki:http://www.okada.jp.org/RWiki/]]のQ&A(初級者コース) 2009年2月16日に,1-7 の数値をそれぞれ 7-1に変換する方法の問い合わせがある.結局

 sid<-c(1,2,3,4,5,6,7,8,9,10)
 q01<-c(2,4,5,2,1,3,2,3,4,5)
 RDT<-data.frame(SID=sid, Q01=q01)
 for (i in 1:7) RDT$Q01a[RDT$Q01 == i] <- 8-i 

というコードが紹介されている.でも R なら

 sapply(RDT$Q01, function(x){8-x})

を使ってほしい気もする.ベクトルの要素数が多い場合,こっちの方が効率が良いと思う.

 pt1 <- proc.time()
 for (i in 1:7) RDT$Q01a[RDT$Q01 == i] <- 8-i 
 pt2 <- proc.time()
 pt2 - pt1
 
 pt1 <- proc.time()
 RDT$Q01a <- sapply(RDT$Q01, function(x){8-x})
 pt2 <- proc.time()
 pt2 - pt1

ついでに,この場合は 8 から引けばよいが,
たとえば 1 を A,2 を B に変えるなどしたければ,こうするかな.


 RDT$Q01b <-  LETTERS[1:10][RDT$Q01]

この処理はわかりにくければ,test なんてデータフレームを作っておいて,

 test <- data.frame(X = 1:7, Y = LETTERS[1:7])
 
 RDT$Q01b <- sapply(RDT$Q01,
 RDT$Q01c <- sapply(RDT$Q01,
   function(x){test$Y[which(x ==  test$X)]})

わざわざ test なんてオブジェクトを作る必要はないか.

 RDT$Q01b <-  LETTERS[1:10][RDT$Q01]