我想通过 dplyr
中的 mutate_if
将 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))
返回错误:
Error in
vapply(tbl, p, logical(1), ...)
: values must be length 1, butFUN(X[[1]])
result is length 32
此操作的正确语法是什么?
最佳答案
我从 purrr tutorial 学到了这个技巧,并且它也适用于 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
是每一列。
关于r - mutate_if 的正确语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42052078/