1. ホーム
  2. r

[解決済み] mutate_ifの正しい構文

2022-03-06 23:17:06

質問

を置き換えたいのですが NA の値をゼロに置き換えます。 mutate_ifdplyr . 以下のような構文になります。

set.seed(1)
mtcars[sample(1:dim(mtcars)[1], 5),
       sample(1:dim(mtcars)[2], 5)] <-  NA

require(dplyr)

mtcars %>% 
    mutate_if(is.na,0)

mtcars %>% 
    mutate_if(is.na, funs(. = 0))

エラーを返します。

のエラー vapply(tbl, p, logical(1), ...) : 値は長さ1でなければなりません。 しかし FUN(X[[1]]) の結果は、長さ32

この操作の正しい構文は?

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

このトリックは purrrチュートリアル そして、それはdplyrでも有効です。 この問題を解決する方法は2つあります。
まず、パイプの外側でカスタム関数を定義し、それを mutate_if() :

any_column_NA <- function(x){
    any(is.na(x))
}
replace_NA_0 <- function(x){
    if_else(is.na(x),0,x)
}
mtcars %>% mutate_if(any_column_NA,replace_NA_0)

次に ~ , . または .x .( .x は、次のように置き換えることができます。 . 他の文字や記号は使用できません)。

mtcars %>% mutate_if(~ any(is.na(.x)),~ if_else(is.na(.x),0,.x))
#This also works
mtcars %>% mutate_if(~ any(is.na(.)),~ if_else(is.na(.),0,.))

また、あなたの場合は mutate_all() :

mtcars %>% mutate_all(~ if_else(is.na(.x),0,.x))

使用方法 ~ であれば、無名関数を定義することができます。 .x または . は変数を表します。で mutate_if() の場合です。 . または .x は各カラムです。