ggplot2::diamonds |>
dplyr::mutate(
mean = mean(c(x, y, z)),
.before = carat
)行処理・列処理
行処理
- 関数の結果を新しい列に挿入したいが、下記コードでは値が全て 同じになってしまう…
- mean列の値が全て同じになってしまっている
- 上記のような場合は、dplyr::pick()とpurrr::reduce()を組み合わせることで解決できる
- pick 関数で、複数の列を選択する
- reduce 関数で、列ごとに同じ処理を適用して1つの値を算出する
ggplot2::diamonds |>
dplyr::mutate(
mean = (dplyr::pick(x:z) |>
purrr::reduce(`+`)) / 3,
.before = carat
)- また、dplyr::rowwise() を挟むことでも解決は可能
ggplot2::diamonds |>
dplyr::rowwise() |> # rowwise()で行処理
dplyr::mutate(
mean = mean(c(x, y, z)),
.before = carat
)列処理
- mutate(across( 列の指定, 処理内容 ))
- 列のデータ型の変換に便利 (特に文字列型 → 数値型)
- 全ての列を指定したい場合は dplyr::everything()
- 末尾の列を表記したい場合は、dplyr::last_col()
- 括弧に数字nを入れると、最後からn番目の列という意味になる
# 架空のデータフレームを作成
# val1からval4までの列は文字列型になってしまっている (という設定)
df <- tibble::tribble(
~id, ~group, ~val1, ~val2, ~val3, ~val4,
1, "A", "2", "1", "99", "0",
2, "B", "-1", "0", "1", "2",
3, "C", "1", "66", "1", "0",
4, "D", "-1", "0", "1", "-1",
5, "A", "99", "-1", "2", "0",
6, "B", "-1", "0", "-1", "0",
7, "C", "0", "-1", "1", "66",
8, "D", "1", "0", "-1", "0",
9, "A", "1", "0", "99", "1",
10, "B", "1", "0", "-1", "0",
)
dfdf |>
dplyr::mutate(
dplyr::across(dplyr::starts_with("val"), as.numeric) # val から始まる名前の列をすべて数値型に変換
)df |>
dplyr::mutate(
dplyr::across(dplyr::starts_with("val"), ~dplyr::if_else(. %in% c(66, 99), NA, .)) # val から始まる名前の列で、66と99を欠損値扱いに
)