我想在NA
中通过mutate_if
将dplyr
值替换为0。语法如下:
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
此操作的正确语法是什么?
答案 0 :(得分:42)
mutate_if
中的“if”指的是选择列,而不是行。例如,mutate_if(data, is.numeric, ...)
表示对数据集中的所有数字列执行转换。
如果要在数字列中用零替换所有NA:
data %>% mutate_if(is.numeric, funs(ifelse(is.na(.), 0, .)))
答案 1 :(得分:31)
我从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
。
答案 2 :(得分:8)
mtcars %>% mutate_if(is.numeric, replace_na, 0)
答案 3 :(得分:3)
我们可以使用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)
}
答案 4 :(得分:0)
我一直在为dplyr的replace_na函数而苦恼
replace(is.na(.),0)
这对我有用,因为您正在尝试做。