頻繁に使うのに忘れてしまうコードなので、メモ。
サンプルデータの呼び出し
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