首页 > 解决方案 > 处理不完整的案例并进行估算?

问题描述

我有一个这样的数据框:

df <- data_frame('col1' = c(NA, 1, 2), 'col2' = c(34, NA, 44), 'indicator' = c(1,1,0))

我曾经complete.cases标记所有不完整的案例。

现在我想要做的是每列用10ifindicator == 1和else 替换 NA 值。0

试图用applyand来做到这一点MARGIN = 2

请告知如何执行此类任务。

标签: rdataframe

解决方案


我们可以使用mutate_atfrom dplyrvars在 的 的参数中指定感兴趣的列,在mutate_atfuns创建一个逻辑条件,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

推荐阅读