mutate_if

时间:2017-02-05 12:31:52

标签: r dplyr na

我想在NA中通过mutate_ifdplyr值替换为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

此操作的正确语法是什么?

5 个答案:

答案 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)

这对我有用,因为您正在尝试做。