mutate_ifの正しい構文 質問する

mutate_ifの正しい構文 質問する

inNAを介して値をゼロに置き換えたいと思います。構文は以下のとおりです。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 です

この操作の正しい構文は何ですか?

ベストアンサー1

このトリックは、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各列です。

おすすめ記事