58  レベルを置き換える

それでは、因子型の水準を手動で置き換えていきましょう

alcohol = c("週1日以内","週4-6日","週4-6日","毎日","のまない","週1-3日","毎日")
vec_f <- as.factor(alcohol)
levels(vec_f)
[1] "のまない"  "週1-3日"   "週1日以内" "週4-6日"   "毎日"     

は実行すると、水準を表示してくれますが、

levels(vec_f) <- c("いち","に","さん","し","ご")

levels(vec_f)
[1] "いち" "に"   "さん" "し"   "ご"  

このように、代入してあげると、対応表を与えた文字列で置き換える使い方も可能です。

vec_f
[1] さん し   し   ご   いち に   ご  
Levels: いち に さん し ご

置き換えた結果が反映されていますね?

vec1 <- as.factor(alcohol)

vec2 <- vec1
levels(vec2) <- c("いち","に","さん","し","ご")

vec1
[1] 週1日以内 週4-6日   週4-6日   毎日      のまない  週1-3日   毎日     
Levels: のまない 週1-3日 週1日以内 週4-6日 毎日
vec2
[1] さん し   し   ご   いち に   ご  
Levels: いち に さん し ご
as.numeric(vec1)
[1] 3 4 4 5 1 2 5
as.numeric(vec2)
[1] 3 4 4 5 1 2 5

レベルを置き換えた後、数字型にするとvec1とvec2は一致していますが、

as.character(vec1)
[1] "週1日以内" "週4-6日"   "週4-6日"   "毎日"      "のまない"  "週1-3日"  
[7] "毎日"     
as.character(vec2)
[1] "さん" "し"   "し"   "ご"   "いち" "に"   "ご"  

文字列型に置き換えると、このように結果が変わっているということを確認しておいてください。

それで、この置き換えですが、一部だけを置き換えることも可能です。

その場合、[]での位置指定を行ってあげると比較的簡単に狙った場所の値を置き換えられます。

[]は、

c("いち","に","さん","し","ご")[1]
[1] "いち"
c("いち","に","さん","し","ご")[2]
[1] "に"
c("いち","に","さん","し","ご")[3]
[1] "さん"
c("いち","に","さん","し","ご")[4]
[1] "し"
c("いち","に","さん","し","ご")[5]
[1] "ご"

このように、ベクトルの後に、数字を入れて 指定してあげることでその場所の要素を 取り出すことができます。また 変数に対しては代入も可能なので

c("いち","に","さん","し","ご")[1] <- "ONE"
Error in c("いち", "に", "さん", "し", "ご")[1] <- "ONE": target of assignment expands to non-language object

これはだめですが、

temp <- c("いち","に","さん","し","ご")
temp[1] <- "ONE"
temp
[1] "ONE"  "に"   "さん" "し"   "ご"  

こんな風に、置き換えることができました!

レベルも同様に、

vec2
[1] さん し   し   ご   いち に   ご  
Levels: いち に さん し ご
levels(vec2)[4] <- "Four!"

vec2
[1] さん  Four! Four! ご    いち  に    ご   
Levels: いち に さん Four! ご

置き換えることができました。

また、複数同時に置き換えたい場合は、

temp[c(2,5)]
[1] "に" "ご"

で別々の場所を指定できるので、

temp
[1] "ONE"  "に"   "さん" "し"   "ご"  
temp[c(2,4)] <- c("TWO","FOUR")
temp
[1] "ONE"  "TWO"  "さん" "FOUR" "ご"  

を利用して、

vec2
[1] さん  Four! Four! ご    いち  に    ご   
Levels: いち に さん Four! ご
levels(vec2)[c(2,5)] <- c("Two","Five")
vec2
[1] さん  Four! Four! Five  いち  Two   Five 
Levels: いち Two さん Four! Five

とすることが可能ですし、因子型にレベルを追加したい場合は、

temp
[1] "ONE"  "TWO"  "さん" "FOUR" "ご"  
temp <- c(temp,"ろく","なな")
temp
[1] "ONE"  "TWO"  "さん" "FOUR" "ご"   "ろく" "なな"

を利用して、

vec2
[1] さん  Four! Four! Five  いち  Two   Five 
Levels: いち Two さん Four! Five
levels(vec2) <- c(levels(vec2), "Six","Seven")
levels(vec2)
[1] "いち"  "Two"   "さん"  "Four!" "Five"  "Six"   "Seven"
vec2
[1] さん  Four! Four! Five  いち  Two   Five 
Levels: いち Two さん Four! Five Six Seven

としてあげるとよいです。

ちょっと最後は駆け足でしたが、現時点では、

ということを覚えていただいておく程度で問題ありません。

次は因子型の対応表も指定して作成する方法を解説いたします。