我有一个包含许多数据表的列表.对于这些表中的每一个,我想用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)));
Run Code Online (Sandbox Code Playgroud)
在一个data.table中将NA更改为0就像一个魅力:
d <- "dt1";
li[[d]][is.na(li[[d]])]<-0;
Run Code Online (Sandbox Code Playgroud)
结果是:
> li
$dt1
name age
1: 4 12
2: 5 0
$dt2
name age
1: 43 354
2: 245 NA
3: 243 NA
Run Code Online (Sandbox Code Playgroud)
但是当我尝试:
test <- lapply(names(li), function(d) li[[d]][is.na(li[[d]])]<-0)
Run Code Online (Sandbox Code Playgroud)
我明白了:
> test
[[1]]
[1] 0
[[2]]
[1] 0
Run Code Online (Sandbox Code Playgroud)
如果没有在列表中的所有数据表上使用循环,有没有办法做到这一点?
您只需要返回list元素
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
Run Code Online (Sandbox Code Playgroud)
你也可以使用:
lapply(li, function(d) { d[is.na(d)] <- 0; d })
Run Code Online (Sandbox Code Playgroud)
另外一个选项:
library(dplyr)
lapply(li, function(x) { mutate_each(x, funs(replace(., is.na(.), 0))) })
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
896 次 |
| 最近记录: |