替换列表中所有数据表中的NA

时间:2015-09-11 11:01:45

标签: r lapply

我有一个包含许多数据表的列表。对于这些表中的每一个,我想用NA替换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

如果不在列表中的所有数据表上使用循环,有没有办法做到这一点?

3 个答案:

答案 0 :(得分:8)

您只需要返回列表元素

Java

你也可以使用:

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

答案 1 :(得分:5)

另一种选择:

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

答案 2 :(得分:3)

如果您希望针对不同列的NA进行不同的替换。 使用库replace_na

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

此处replace_na需要每列的替换列表,当您可能希望在每个具有相同值的列中替换NA时,此列表非常有用。

希望这有效。