行処理・列処理

行処理

  • 関数の結果を新しい列に挿入したいが、下記コードでは値が全て 同じになってしまう…
  • mean列の値が全て同じになってしまっている
ggplot2::diamonds |> 
  dplyr::mutate(
    mean = mean(c(x, y, z)),
    .before = carat
  )
  • 上記のような場合は、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",
)
df
df |> 
  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を欠損値扱いに
  )