井出草平の研究ノート

Rでのリコード[R]

頻繁に使うのに忘れてしまうコードなので、メモ。

サンプルデータの呼び出し

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