r - 用 'x[is.na(x)]=0' 将 NA 替换为 0 会替换整个数据帧,而不仅仅是 NA?
问题描述
我有点困惑。我在列表中的数据框 包含 NA 值,我想将其替换为 0。在单个数据帧上,我可以通过 轻松实现这一点df[is.na(df)]=0
,并且在应用于单个 data.frame 时效果很好。但是,当应用于列表 ( lapply(l, function(x) x[is.na(x)]=0)
) 时,这会生成仅包含 0 的数据帧。
虚拟数据:
df1<-data.frame(class = rep("BO", 3),
a = c(NA,2,3))
df2<-data.frame(class = rep("BS", 3),
a = c(5,NA,7))
l<-list(df1, df2)
# Convert NA to 0
l2<-lapply(l, function(x) x[is.na(x)]=0)
结果是:
[[1]]
[1] 0
[[2]]
[1] 0
但我怎么能得到这个?
[[1]]
class a
1 BO 0
2 BO 2
3 BO 3
[[2]]
class a
1 BS 5
2 BS 0
3 BS 7
解决方案
我们需要返回'x'。在这里,我们只返回赋值 0。数据集x
来自 lambda 函数调用
lapply(l, function(x) {x[is.na(x)] <- 0
x})
这可以在带有包装器的单个语句中完成replace
(它在内部进行分配并返回'x'
lapply(l, function(x) replace(x, is.na(x), 0))
replace
在哪里
function (x, list, values) {
x[list] <- values
x
}
除了base R
, 选项,我们也可以这样tidyverse
做
library(tidyverse)
map(l, ~ .x %>%
mutate_all(replace_na, 0))
由于我们仅将数字列缺失值替换为 0,因此我们可以使用mutate_if
map(l, ~ .x %>%
mutate_if(is.numeric, replace_na, 0))
推荐阅读
- angular - Angular 2中的自动完成在选择后在输入框中显示id而不是名称
- angular - 日期列排序在 Primeng 中不起作用
- java - 在 Spring Container 中,@Autowire 如何跟踪在 setter 方法中注入的依赖项
- node.js - 有没有一种方法可以比 .populate() 更有效地验证 mongoose 中的相关文档并将其聚合在一起
- sql - 如何通过另一个表设置唯一键检查
- javascript - "IndexOf" function in ReactJS doesn't work like the vanilla JS approach
- java - 获取 ul 中 li 元素的数量而不存储在列表中
- python - 更改“py.exe”的窗口大小
- angular6 - 如何重定向到 Angular 6 中的特定选项卡?
- callback - Twilio 项目 - 修改来电显示名称和号码