1
0

More than 3 years have passed since last update.

Rでラベルの読み替え(数値⇔ラベルの変換)

Posted at

はじめに

例えば以下のようなデータがあった場合を考える。

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) などベクトルの中身を逆にすればよい。

おわりに

この方法だと確かに変換はできるが、変換ごとに関数を作る、列名から列番号を吸い出す作業が必要になる。もっといい変換方法があれば是非コメント下さい!

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0