簡體   English   中英

mutate_if 的正確語法

[英]Correct syntax for mutate_if

我想通過mutate_if中的dplyr用零替換NA值。 下面的語法:

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

此操作的正確語法是什么?

mutate_if的“if”是指選擇,而不是行。 例如mutate_if(data, is.numeric, ...)表示對數據集中的所有數字列執行轉換。

如果要將數字列中的所有 NA 替換為零:

data %>% mutate_if(is.numeric, funs(ifelse(is.na(.), 0, .)))

我從purrr 教程中學到了這個技巧,它也適用於 dplyr。 有兩種方法可以解決這個問題:
首先,在管道外定義自定義函數,並在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是每一列。

mtcars %>% mutate_if(is.numeric, replace_na, 0)

我們可以用setdata.table

library(data.table)
setDT(mtcars)
for(j in seq_along(mtcars)){
  set(mtcars, i= which(is.na(mtcars[[j]])), j = j, value = 0)
 }

我總是在與 dplyr 的 replace_na 功能斗爭

  replace(is.na(.),0)

這對我來說適用於你正在嘗試做的事情。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM