頻繁に使うのに忘れてしまうコードなので、メモ。
サンプルデータの呼び出し
library(AER) #パッケージの呼び出し。CPS1985というデータがこのパッケージに含まれている data(CPS1985) #CPS1985データの行頭のみ表示
memiscパッケージ
library(memisc) CPS1985$gender <- memisc::recode(CPS1985$gender, "1" <- "male", "2"<-"female") CPS1985$gender <- memisc::recode(CPS1985$gender, 1 <- "male", 2<-"female")
どちらでも可。factor型で返されるので実数型に変更する場合にはas.numeric()
をかける。
https://rdrr.io/cran/memisc/man/recode.html
carパッケージ
library(car) CPS1985$gender <- car::recode(CPS1985$gender , "'male'=1; 'female'=2")
carパッケージの場合は変化前を左に置く。文字型はシングルコーテーションで括る。
ベクターでの指定はc(7,8,9)='high'
、範囲は7:9='C'
、混合でc(1, 3, 5:7)
という指定も。
こちらも、factor型で返されるので実数型に変更する場合にはas.numeric()
をかける。
https://rdrr.io/cran/car/man/recode.html
パイプ演算子 mutate()
library(dplyr) CPS1985 %>% mutate(gender = recode(gender, "male" = 1, "female" = 2))
mutate()の場合、変化前を左に置く。
https://www.jaysong.net/dplyr_intro/
条件付けリコード conditional recoding
例:学歴(カテゴリカル)を教育年数(連続)に変換
highが高校、univが大学、gradが卒業、dropoutが中退。
library(readr) education <- read_csv("school, graduate high, grad univ, grad univ, dropout high, dropout" )
データ。
school graduate <chr> <chr> 1 high grad 2 univ grad 3 univ dropout 4 high dropout
教育年数(eduyear)に変換する。
library(dplyr) education <- education %>% mutate(eduyear = case_when( school == "high" & graduate == "grad" ~ 12, school == "high" & graduate == "dropout" ~ 9, school == "univ" & graduate == "grad" ~ 16, school == "univ" & graduate == "dropout" ~ 12 ))
結果。
school graduate eduyear <chr> <chr> <dbl> 1 high grad 12 2 univ grad 16 3 univ dropout 12 4 high dropout 9
その他の例
https://rpubs.com/prlicari13/541675
単一条件
library(readr) candy<-read_csv("name, pieces Sarah, 7 Stephanie, 5 Stephen, 4 Jason, 6 Matthew, 3 Rose, 5")
データはこちら。
# A tibble: 6 x 2 name pieces <chr> <dbl> 1 Sarah 7 2 Stephanie 5 3 Stephen 4 4 Jason 6 5 Matthew 3 6 Rose 5
これに新しい列relative.amoun
を作成し、5以上をAbove Average、5をAverage、5以下をBelow Averageとする。
candy <- candy %>% mutate(relative.amount = case_when( pieces < 5 ~ "Below Average", pieces == 5 ~ "Average", pieces > 5 ~ "Above Average" ))
列が加えられたデータはこちら
# A tibble: 6 x 3 name pieces relative.amount <chr> <dbl> <chr> 1 Sarah 7 Above Average 2 Stephanie 5 Average 3 Stephen 4 Below Average 4 Jason 6 Above Average 5 Matthew 3 Below Average 6 Rose 5 Average
パイプを使わない書き方。
(candy<-mutate(candy, relative.amount = case_when( pieces < 5 ~ "Below Average", pieces == 5 ~ "Average", pieces > 5 ~ "Above Average" )))
一度relative.amount
の列を除去
candy <- candy[,- 3]
# A tibble: 6 x 2 name pieces <chr> <dbl> 1 Sarah 7 2 Stephanie 5 3 Stephen 4 4 Jason 6 5 Matthew 3 6 Rose 5
複合条件
candy <- candy %>% mutate(relative.amount = case_when( pieces < 5 ~ "Below Average", ## piecesが5以下は"Below Average"に pieces < 5 | pieces %% 2 == 0 ~ "Less or Even", ## piecesが5以下、または、pieces÷2の余りが0 pieces == 5 ~ "Average", ## piecesが5は"Average" pieces > 5 ~ "Above Average", ## piecesが5以上は"Above Average" pieces > 5 & pieces %% 3 == 0 ~ "More and Divide by 3" ## piecesが5以上、かつ、pieces÷3の余りが0は"More and Divide by 3" ))
%%
は除算の余りのこと。 7 %/% 3
は2に, 7 %% 3
は 1。
AND条件は&
、OR条件は|
を使う。
# A tibble: 6 x 3 name pieces relative.amount <chr> <dbl> <chr> 1 Sarah 7 Above Average 2 Stephanie 5 Average 3 Stephen 4 Below Average 4 Jason 6 Less or Even 5 Matthew 3 Below Average 6 Rose 5 Average