#前提
前処理の際に、同じようなコードを書繰り返し書くことがないでしょうか。
私はアンケート調査・研究調査で回答項目の値変換するときに、同じようなコードを書いて前処理していましたが、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()は繰り返し処理をしてくれるので、いろんな場面で使えそうです。
#参考