1. ホーム
  2. r

[解決済み] dplyrのmutate_at呼び出しで複数列の関数を使用する

2022-03-08 17:57:52

質問

dplyrの mutate_at 関数が直接適用される列とデータフレーム内の別の列を入力する場合、データフレーム内の複数の列に関数を適用することができます。

具体的な例として、次のようなデータフレームを変異させたいと思います。

# Example input dataframe
df <- data.frame(
    x = c(TRUE, TRUE, FALSE),
    y = c("Hello", "Hola", "Ciao"),
    z = c("World", "ao", "HaOlam")
)

を持つ mutate_at の呼び出しは、次のようなものです。

df %>%
mutate_at(.vars = vars(y, z),
          .funs = ifelse(x, ., NA))

を実行すると、次のようなデータフレームが返されます。

# Desired output dataframe
df2 <- data.frame(x = c(TRUE, TRUE, FALSE),
                  y_1 = c("Hello", "Hola", NA),
                  z_1 = c("World", "ao", NA))

希望する mutate_at の呼び出しは、次のようなものになるでしょう。 mutate :

df %>%
   mutate(y_1 = ifelse(x, y, NA),
          z_1 = ifelse(x, z, NA))

これは、ベースRでいくつかの方法でできることは知っていますが、特にdplyrの mutate_at 関数は、読みやすさやデータベースとの連動性などの観点から

以下は、stackoverflowに寄せられた同様の質問です。 しない 私がここで投げかけた質問を扱っています。

dplyrのmutate呼び出しで複数の列を追加する

dplyr::mutate による複数値の追加

dplyr の mutate() 関数を使用した sum() 関数内の列の使用

どのように解決するのですか?

これは、@eipi10さんの質問コメントで回答されていますが、後学のためにここに書いておきます。

ここでの解決策は、「使用すること」です。

df %>%
   mutate_at(.vars = vars(y, z),
             .funs = list(~ ifelse(x, ., NA)))

また、新しい across() 関数に mutate() というように

df %>%
   mutate(across(c(y, z), ~ ifelse(x, ., NA)))

数式演算子の使用(例えば ~ ifelse(...) ということを表しています。 ifelse(x, ., NA) への呼び出しの中で定義されている無名関数です。 mutate_at() .

の呼び出しの外側で関数を定義するのと同じように機能します。 mutate_at() というように。

temp_fn <- function(input) ifelse(test = df[["x"]],
                                  yes = input,
                                  no = NA)

df %>%
   mutate_at(.vars = vars(y, z),
             .funs = temp_fn)

dplyrの構文変更に関する注意事項。 dplyrのバージョン0.8.0以前は、単純に以下のように記述していました。 .funs = funs(ifelse(x, . , NA)) が、その funs() 関数は非推奨で、まもなくdplyrから削除される予定です。