はじめに
例えば以下のようなデータがあった場合を考える。
NAME | HEIGHT | SEX | y |
---|---|---|---|
Taro | 170.6 | 1 | 0 |
Hanako | 158.3 | 2 | 0 |
Jiro | 172.1 | 1 | 1 |
三列目は性別を表していて、1=male(男性)、2=female(女性)である。四列目はアンケートの回答を表していて、0=no、1=yesである。これを文字列を含んだデータに直したいというのが今回の課題。
データ生成
上記のテーブルをRに組み込む。csvからの読み込みを想定してdata.frameにしておく。
コード
NAME <- c("Taro", "Hanako", "Jiro")
HEIGHT <- c(170.6, 158.3, 172.1)
SEX <- c(1, 2, 1)
y <- c(0, 0, 1)
dat <- data.frame(NAME, HEIGHT, SEX, y)
dat
出力
NAME HEIGHT SEX y
1 Taro 170.6 1 0
2 Hanako 158.3 2 0
3 Jiro 172.1 1 1
name 付きベクトルで一括変換
nameが付いたベクトルを用いてリストの中身を一括変換する方法で実装する。
コード
#male, female に直す関数
tomf <- function(x) {
label2mf <- c("1"="male", "2"="female")
label2mf[as.character(x)]
}
#yes, no に直す関数
toyn <- function(x) {
label2yn <- c("0"="no", "1"="yes")
label2yn[as.character(x)]
}
#列名から列番号を取得
n.sex <- which(colnames(dat)=="SEX")
n.y <- which(colnames(dat)=="y")
#変換
dat[,n.sex] <- tomf(dat[,n.sex]) #dat[,3] のように直接指定しても問題無し。
dat[,n.y] <- toyn(dat[,n.y])
dat
出力
NAME HEIGHT SEX y
1 Taro 170.6 male no
2 Hanako 158.3 female no
3 Jiro 172.1 male yes
性別、yが文字列に変換されているdata.frameが出来上がった。
逆に文字列から数値に直したい場合は label2mf <- c("male"=1, "female"=2) などベクトルの中身を逆にすればよい。
おわりに
この方法だと確かに変換はできるが、変換ごとに関数を作る、列名から列番号を吸い出す作業が必要になる。もっといい変換方法があれば是非コメント下さい!