【问题标题】:How to replace all NA in a dataframe using tidyr::replace_na? [duplicate]如何使用 tidyr::replace_na 替换数据框中的所有 NA? [复制]
【发布时间】:2018-01-16 12:35:13
【问题描述】:

我正在尝试用 0 填充数据中的所有 NA。有谁知道如何使用 tidyr 的 replace_na 来做到这一点?从文档中,我们可以轻松地将不同列中的 NA 替换为不同的值。但是如何将它们全部替换为一些值呢?我有很多专栏...

以mtcars数据集为例:

mtcars [sample(1:nrow(mtcars), 4), sample(1:ncol(mtcars), 4)]<- NA
mtcars %>% replace_na( ??? )

【问题讨论】:

  • 你想用相同的值替换所有的 NA 吗?
  • mtcars %&gt;% mutate_all(coalesce, 0)

标签: r dplyr tidyr


【解决方案1】:

如果 replace_na 不是强制性要求,以下代码将起作用:

mtcars %>% replace(is.na(.), 0)

参考问题:https://stackoverflow.com/a/45574804/8382207

【讨论】:

  • 谢谢。这样可行。 replace_na 可以吗?只是好奇。 @Sagar
【解决方案2】:

我找到了一种方法让它按照要求与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 &lt; 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 的两个实例替换为您在创建myList 对象时为您的工作数据框命名的任何名称。

【讨论】:

  • 您也可以使用点来表示数据框并在管道中使用列表。 mtcars %&gt;% replace_na(setNames(lapply(vector("list", ncol(.)), function(x) x &lt;- 0), names(.)))
  • df %>% mutate(cross(everything(), replace_na, 0))
【解决方案3】:
library(dplyr)
mydata <- mtcars
mydata[sample(1:nrow(mydata), 4), sample(1:ncol(mydata), 4)]<- NA
mydata %>% mutate_each(funs(replace(., is.na(.), 0)))

【讨论】:

  • 很想听听关于为什么这值得反对的反馈。
  • 您似乎丢失了行名...
猜你喜欢
  • 2018-08-26
  • 1970-01-01
  • 2018-02-21
  • 2017-05-02
  • 2021-08-30
  • 2019-06-10
  • 1970-01-01
  • 1970-01-01
  • 2013-09-04
相关资源
最近更新 更多