r - 处理不完整的案例并进行估算?
问题描述
我有一个这样的数据框:
df <- data_frame('col1' = c(NA, 1, 2), 'col2' = c(34, NA, 44), 'indicator' = c(1,1,0))
我曾经complete.cases
标记所有不完整的案例。
现在我想要做的是每列用10
ifindicator == 1
和else 替换 NA 值。0
试图用apply
and来做到这一点MARGIN = 2
。
请告知如何执行此类任务。
解决方案
我们可以使用mutate_at
from dplyr
。vars
在 的 的参数中指定感兴趣的列,在mutate_at
中funs
创建一个逻辑条件,case_when
用满足条件的值替换
library(dplyr)
df %>%
mutate_at(vars(matches("col\\d+")),
funs(case_when(is.na(.) & as.logical(indicator)~ 10,
is.na(.) & !indicator ~ 0,
TRUE ~ .)))
# A tibble: 3 x 3
# col1 col2 indicator
# <dbl> <dbl> <dbl>
# 1 10 34 1
# 2 1 10 1
# 3 2 44 0
这也可以用data.table
library(data.table)
setDT(df)
for(j in names(df)[1:2]) {
i1 <- is.na(df[[j]])
i2 <- as.logical(df[['indicator']])
set(df, i = which(i1 & i2), j = j, value = 10)
set(df, i = which(i1 & !i2), j = j, value = 0)
}
如果我们希望列的最大值而不是 10 来替换NA
'indicator' 为 1 的值,请使用max
df %>%
mutate_at(vars(matches("col\\d+")),
funs(case_when(is.na(.) & as.logical(indicator)~ max(., na.rm = TRUE),
is.na(.) & !indicator ~ 0,
TRUE ~ .)))
# A tibble: 3 x 3
# col1 col2 indicator
# <dbl> <dbl> <dbl>
#1 2 34 1
#2 1 44 1
#3 2 44 0
推荐阅读
- c - 如何使用微控制器检测键盘矩阵中开关的释放?
- bootstrap-4 - 引导列表-组-项目显示
- csv - 从 .csv 创建 .jsonl 文件
- python - Web Scraping Linkedin Profiles:无法选择所有链接
- sql-server - 如何连接到 Parallels VM 上的 SQL Server
- go - Sarama Kafka 消费者组函数返回
- angular - 'reducers' 模板编译期间出错:不支持表达式形式
- google-chrome - 为多个页面/URL 运行灯塔
- java - 嵌套类:`OuterClass.this.someAttribute`?
- python - 如何在 Chrome 中打开 URL 并获取其内容?