如何使用tidyr::replace_na替换数据框中的所有NA?

79
我想用0填充数据中的所有NA。有人知道如何使用tidyr中的replace_na来实现吗?根据文档,我们可以轻松地将不同列中的NA替换为不同的值。但是如何用某个值替换掉所有的NA?我有很多列...
以mtcars数据集为例:
mtcars [sample(1:nrow(mtcars), 4), sample(1:ncol(mtcars), 4)]<- NA
mtcars %>% replace_na( ??? )

你想用相同的值替换所有的NA吗? - Orhan Yazar
25
mtcars %>% mutate_all(coalesce, 0) - alistaire
3个回答

154

1
谢谢。那个有效。使用replace_na可以实现吗?只是好奇。@Sagar - zesla
无法工作,它告诉我 在 eval(ei, envir) 中出现错误:找不到对象 '.' - robertspierre

93

我找到了一种方法,可以按要求使用replace_na使其正常工作(经过微基准测试,这是最快的选项):

使用dplyr v1.0.0进行更新

借助dplyr::across函数的新增功能,此操作变得更加容易:

library(dplyr)
library(tidyr)

mtcars %>% 
  mutate(
    across(everything(), ~replace_na(.x, 0))
  )

# Or if you're pipe shy:
mutate(mtcars, across(everything(), ~replace_na(.x, 0)))

就这样!相当简单。

对于 dplyr < v1.0.0

library(tidyr)
library(dplyr)

# First, create a list of all column names and set to 0
myList <- setNames(lapply(vector("list", ncol(mtcars)), function(x) x <- 0), names(mtcars))

# Now use that list in tidyr::replace_na 
mtcars %>% replace_na(myList)

要将此应用于您的工作数据框,请确保将 mtcars 的 2 个实例替换为您在创建 myList 对象时命名的工作数据框。

要将此方法应用到您的工作数据框上,请务必将上述代码中的两个 mtcars 实例替换为您所使用的工作数据框的名称,并且这个工作数据框需要在创建 myList 对象时被命名。


2
你也可以使用点来表示数据框,并在管道内使用列表。mtcars %>% replace_na(setNames(lapply(vector("list", ncol(.)), function(x) x <- 0), names(.))) - Todd
2
df %>% mutate( across(everything(), replace_na, 0) ) - Vincent Guyader
找到这个符号 '.x' 花了我一些时间。谢谢! - undefined

5
library(dplyr)
mydata <- mtcars
mydata[sample(1:nrow(mydata), 4), sample(1:ncol(mydata), 4)]<- NA
mydata %>% mutate_each(funs(replace(., is.na(.), 0)))

1
很想听听为什么这个被踩的理由。 - airstrike
1
你似乎丢失了行名称... - Werner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接