[英]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)
我們可以用set
從data.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.