廿TT

譬如水怙牛過窓櫺 頭角四蹄都過了 因甚麼尾巴過不得

R: カテゴリカルデータ(ベクトル)を二値のフラグ(行列)に変換する関数

じっさい使ってみて修正 (2013-01-26)


カテゴリカルデータ(ベクトル)を二値のフラグ(行列)に変換する関数です。

NA を 0 と置いてまずいとき( 0 に『その他』以外の意味があるとき)は引数 na になにか適当な値を。

CtoB <- function(x, rename ="V_", na=0){
	 lab <- unique(x)
   print(lab)
	 naF <- is.na(x)
     if(any(naF)){
	   tmp <- replace(x, naF, na)
	   lab <- lab[!is.na(lab)]
	   cat(paste("NA replace to ", na,".\n", sep="")) 
	  }else{tmp=x}
   print(lab)
	 if(length(lab)==2){tmp2 <- tmp == lab[1]; cat(paste("return '", lab[1],"' flags\n") , sep=""); return(tmp2)
	 }else{
	   tmp2 <- sapply(tmp, function(y) y==lab)
	   tmp2 <- t(tmp2)
	   colnames(tmp2) <- paste(rename, as.character(lab), sep="")
	   rownames(tmp2)<-NULL
	   return(tmp2)
	   }
}


#example
test <- c("a", "b", "a", "b")
test
CtoB(test)
test <-  c("c", test)
test
CtoB(test)
test <- c(test, NA)
test
CtoB(test)
test <- c(1:3,1:2,3,3,4,NA,1)
test
CtoB(test, "name")


こういうのすでにどこかにありそうな気がする。

rename、本当は x の変数名にしたかったけどオブジェクト名を文字列として取得する方法が分からなかった。

10 進数を 2 進数に変えるのはこちらで紹介されている。oro.dicom パッケージの dec2base 関数。

例の結果は以下の通り。

> test <- c("a", "b", "a", "b")
> test
[1] "a" "b" "a" "b"
> CtoB(test)
[1] "a" "b"
[1] "a" "b"
return ' a ' flags
[1]  TRUE FALSE  TRUE FALSE
> test <-  c("c", test)
> test
[1] "c" "a" "b" "a" "b"
> CtoB(test)
[1] "c" "a" "b"
[1] "c" "a" "b"
       V_c   V_a   V_b
[1,]  TRUE FALSE FALSE
[2,] FALSE  TRUE FALSE
[3,] FALSE FALSE  TRUE
[4,] FALSE  TRUE FALSE
[5,] FALSE FALSE  TRUE
> test <- c(test, NA)
> test
[1] "c" "a" "b" "a" "b" NA 
> CtoB(test)
[1] "c" "a" "b" NA 
NA replace to 0.
[1] "c" "a" "b"
       V_c   V_a   V_b
[1,]  TRUE FALSE FALSE
[2,] FALSE  TRUE FALSE
[3,] FALSE FALSE  TRUE
[4,] FALSE  TRUE FALSE
[5,] FALSE FALSE  TRUE
[6,] FALSE FALSE FALSE
> test <- c(1:3,1:2,3,3,4,NA,1)
> test
 [1]  1  2  3  1  2  3  3  4 NA  1
> CtoB(test, "name")
[1]  1  2  3  4 NA
NA replace to 0.
[1] 1 2 3 4
      name1 name2 name3 name4
 [1,]  TRUE FALSE FALSE FALSE
 [2,] FALSE  TRUE FALSE FALSE
 [3,] FALSE FALSE  TRUE FALSE
 [4,]  TRUE FALSE FALSE FALSE
 [5,] FALSE  TRUE FALSE FALSE
 [6,] FALSE FALSE  TRUE FALSE
 [7,] FALSE FALSE  TRUE FALSE
 [8,] FALSE FALSE FALSE  TRUE
 [9,] FALSE FALSE FALSE FALSE
[10,]  TRUE FALSE FALSE FALSE