LoginSignup
3
2

More than 1 year has passed since last update.

dplyr::mutate(across())と自作関数を使ってスマートな前処理をしよう!

Posted at

前提

前処理の際に、同じようなコードを書繰り返し書くことがないでしょうか。
私はアンケート調査・研究調査で回答項目の値変換するときに、同じようなコードを書いて前処理していましたが、across()を使うことでコードを書く量が大幅に減少しました。
今回は、満足度調査を例に、across()を使った値変換をご紹介します。

A・B・C・Dの製品について満足度調査をして下記の結果が得られました。
この回答結果をとても満足=5満足=4普通=3非常に不満足=2非常に不満足=1という感じに点数化したいと思います。

ID A B C D
1 非常に満足 非常に満足 とても満足 満足
2   満足 満足 普通 非常に満足
3 非常に不満足 非常に不満足 不満足 不満足
4 非常に不満足 普通 非常に満足 非常に満足

across()を使わない場合

library(tidyverse)
ID <- c(1, 2, 3, 4)
A <- c("非常に満足", "非常に満足", "非常に満足", "満足")
B <- c("満足", "満足", "普通", "非常に満足")
C <- c("非常に不満足", "非常に不満足", "不満足", "不満足")
D <- c("非常に不満足", "普通", "非常に満足", "非常に満足")
df_example <- data_frame(A = A, B = B, C = C, D = D)

df_example_notacross <- df_example %>%
  mutate(
    A = case_when(
      A == "非常に満足" ~ 5,
      A == "満足" ~ 4,
      A == "普通" ~ 3,
      A == "不満足" ~ 2,
      A == "非常に不満足" ~ 1,
    ),
    B = case_when(
      B == "非常に満足" ~ 5,
      B == "満足" ~ 4,
      B == "普通" ~ 3,
      B == "不満足" ~ 2,
      B == "非常に不満足" ~ 1,
    ),
    C = case_when(
      C == "非常に満足" ~ 5,
      C == "満足" ~ 4,
      C == "普通" ~ 3,
      C == "不満足" ~ 2,
      C == "非常に不満足" ~ 1,
    ),
    D = case_when(
      D == "非常に満足" ~ 5,
      D == "満足" ~ 4,
      D == "普通" ~ 3,
      D == "不満足" ~ 2,
      D == "非常に不満足" ~ 1,
    )
  )

同じような処理を何回も書くことになり、コード量非常に多くなってしまいます。
では、across()を使ってみましょう!

across()を使う場合

#値変換をする自作関数 
Func<-function(colum)(colum = case_when(
  colum== "非常に満足" ~ 5,
  colum == "満足" ~ 4,
  colum == "普通" ~ 3,
  colum == "不満足" ~ 2,
  colum == "非常に不満足" ~ 1,
))

df_example_across <- df_example %>%
  mutate(across(A:D,Func))

自作関数とacross()を使うことでコード量が減少しました!
across()は繰り返し処理をしてくれるので、いろんな場面で使えそうです。

参考

3
2
2

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
3
2