【问题标题】:Replace NA's in all data tables in a list替换列表中所有数据表中的 NA
【发布时间】:2015-09-11 11:01:44
【问题描述】:

我有一个包含许多数据表的列表。对于这些表中的每一个,我想用 0 替换 NA。

我知道如何分别更改每个数据表的 NA,但有没有办法将其放入一个命令中,例如使用 lapply?

例如:li 是一个包含两个数据表的列表,dt1 和 dt2。

li <- list(dt1 = data.table(name = c(4,5), age = c(12, NA)), dt2= data.table(name = c(43,245,243), age = c(354,NA,NA)));

在一个 data.table 中将 NA 更改为 0 就像一个魅力:

d <- "dt1";
li[[d]][is.na(li[[d]])]<-0;

结果:

> li
$dt1
  name age
1:    4  12
2:    5   0
$dt2
name age
1:   43 354
2:  245  NA
3:  243  NA

但是当我尝试时:

test <- lapply(names(li), function(d) li[[d]][is.na(li[[d]])]<-0)

我明白了:

> test
[[1]]
[1] 0
[[2]]
[1] 0

有什么方法可以做到这一点,而无需对列表中的所有数据表使用循环?

【问题讨论】:

  • lapply(li, function(d) {d[is.na(d)] &lt;- 0; d })

标签: r lapply


【解决方案1】:

你只需要返回列表元素

lapply(names(li), function(d) { li[[d]][is.na(li[[d]])] <-0; li[[d]] })
#[[1]]
#   name age
#1:    4  12
#2:    5   0

#[[2]]
#   name age
#1:   43 354
#2:  245   0
#3:  243   0

你也可以使用:

lapply(li, function(d) { d[is.na(d)] <- 0; d })

【讨论】:

  • 谢谢!这实际上是我正在寻找的;因为我希望所有列都替换为相同的值。
【解决方案2】:

另一种选择:

library(dplyr)
lapply(li, function(x) { mutate_each(x, funs(replace(., is.na(.), 0))) })

【讨论】:

    【解决方案3】:

    如果您想对不同的列使用不同的替换 NA。 使用库tidyr中的replace_na函数

    library(tidyr)
    lapply(li,function(df){replace_na(df,list(name=0,age=0))})
    

    这里replace_na 想要一个每列替换的列表,当您可能希望用相同的值替换每一列中的 NA 时,这很有用。

    希望这行得通。

    【讨论】:

    • 有效!非常感谢!但是,没有办法“到处使用零”对吗?我试过 replace_na(df, list(rep(0, 2))) 并没有改变任何东西。所以我猜它确实需要列名(这使得使用这个函数比在列表中的数据表上循环更容易)。
    • 这正是@germcd 的做法,你可以给他点赞;)
    • 哦..对不起..我完全没看到.. :)
    猜你喜欢
    • 2021-11-05
    • 1970-01-01
    • 2020-03-06
    • 2016-12-11
    • 1970-01-01
    • 2018-02-21
    • 1970-01-01
    • 1970-01-01
    • 2018-06-12
    相关资源
    最近更新 更多