使用purrr函数用is.na

时间:2017-05-11 22:21:24

标签: r purrr

我正在寻找一种方法来使用R中的purrr :: map()函数套件替换各种列表项中的NAs。看起来它应该是一个简单的任务,但我无法获得它起作用。

以下作品:

 vec1 <- c(3,6,7,NaN)
 vec1[is.na(vec1)] <- 0

但是当我尝试使用map()为矢量列表执行此操作时,它不起作用:

 library(purrr)

 vec1 <- c(3,6,7,NaN)
 vec2 <- c(2,3,4)
 vec3 <- c(1,6,NaN,NaN,1)

 veclist <- list(a = vec1,
                 b = vec2,
                 c = vec3)

 veclistnew <- map(veclist, function(vec){vec[is.na(vec)] <- 0})

思考?我希望输出是原始向量的列表,其中NA被0替换。

3 个答案:

答案 0 :(得分:3)

您可以执行以下操作:

na_to_y <- function(x, y){
  x[is.na(x)] <- y
  x # you need to return the vector after replacement
}

map(veclist, na_to_y, 0)

答案 1 :(得分:2)

您还可以使用coalesce中的dplyr

library(dplyr)
veclistnew <- map(veclist, ~coalesce(., 0))

> veclistnew
$a
[1] 3 6 7 0

$b
[1] 2 3 4

$c
[1] 1 6 0 0 1

答案 2 :(得分:2)

另一个选项是replace

library(purrr)
veclist %>% 
    map(~replace(., is.nan(.), 0))
#$a
#[1] 3 6 7 0

#$b
#[1] 2 3 4

#$c
#[1] 1 6 0 0 1