替换列表中所有数据表中的NA
Replace NA's in all data tables in a list
我有一个包含很多数据的列表table。对于这些 table 中的每一个,我想用 0 替换 NA。
我知道如何分别更改每个数据 table 的 NA,但是有没有办法将其放入一个命令中,例如,使用 lapply?
例如:li是一个包含两个数据table、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)));
一次将 NA 更改为 0 data.table 非常有效:
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
有什么方法可以在不对列表中的所有数据 table 进行循环的情况下做到这一点?
如果您想要对不同列的 NA
进行不同的替换。
使用库 tidyr
中的 replace_na
函数
library(tidyr)
lapply(li,function(df){replace_na(df,list(name=0,age=0))})
这里 replace_na
想要一个每列的替换列表,当您可能想用相同的值替换每列中的 NA 时,这很有用。
希望这有效。
您只需要return列表元素
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 })
另一个选项:
library(dplyr)
lapply(li, function(x) { mutate_each(x, funs(replace(., is.na(.), 0))) })
我有一个包含很多数据的列表table。对于这些 table 中的每一个,我想用 0 替换 NA。
我知道如何分别更改每个数据 table 的 NA,但是有没有办法将其放入一个命令中,例如,使用 lapply?
例如:li是一个包含两个数据table、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)));
一次将 NA 更改为 0 data.table 非常有效:
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
有什么方法可以在不对列表中的所有数据 table 进行循环的情况下做到这一点?
如果您想要对不同列的 NA
进行不同的替换。
使用库 tidyr
replace_na
函数
library(tidyr)
lapply(li,function(df){replace_na(df,list(name=0,age=0))})
这里 replace_na
想要一个每列的替换列表,当您可能想用相同的值替换每列中的 NA 时,这很有用。
希望这有效。
您只需要return列表元素
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 })
另一个选项:
library(dplyr)
lapply(li, function(x) { mutate_each(x, funs(replace(., is.na(.), 0))) })