仅将缺失信息单独解释为虚拟变量 R

问题描述

在下面的示例数据框中(原始由数千行和数百列组成),Date1和Date2中的一些值是未知的,它们不需要相关:

Data_Frame <- data.frame(ID = c("A1","A2","A3","A4","A5","A6","A7","A8","A9","A10"),Date1 = c("2010-08-03","2012-11-28","2009-12-13","2000-01-15","2003-03-01","2015-05-09","2020-07-11","unkNown","2011-01-04","unkNown"),Value = c(2.86,3.43,4.65,6.91,-2.22,9.92,23.41,-0.032,8.84,10.11),Date2 = c("unkNown","2015-10-22","2019-02-14","2010-11-25","2017-03-12","2019-09-12","2021-05-14","2012-08-20"))

我想避免插补,因为它会生成许多人为的日期值。此外,为了避免为列中的每个日期值创建虚拟变量(它们以千为单位,数据框的大小将迅速增加),创建两列是否有意义,其中 1 是所有日期的条目在第二列中不是未知的值和 0 为未知值,反之亦然,如下所示:

Data_Frame <- add_column(Data_Frame,Date11 = ifelse(Data_Frame$Date1 != 'unkNown',1,0),.after = "Date1")
Data_Frame <- add_column(Data_Frame,Date12 = ifelse(Data_Frame$Date1 == 'unkNown',.after = "Date11")

Data_Frame <- add_column(Data_Frame,Date21 = ifelse(Data_Frame$Date2 != 'unkNown',.after = "Date2")
Data_Frame <- add_column(Data_Frame,Date22 = ifelse(Data_Frame$Date2 == 'unkNown',.after = "Date21")

给出

enter image description here

在分析中使用 Date11、Date12、Date21 和 Date22 并删除 Date1 和 Date2 是否有意义?我相信这是错误的。例如,如果在数据预处理期间必须处理因子列中的一个级别以生成虚拟变量而不是所有条目(以避免额外的列)以避免信息丢失,那么如何处理这样的问题?

解决方法

您可以一次处理所有 "^Date" 列。 +(.) 将逻辑结果强制为整数,但您也可以说 as.integer(.)

res <- data.frame(Data_Frame,+(Data_Frame[grep('^Date',names(Data_Frame))] == 'unknown'))
res
#     ID      Date1  Value      Date2 Date1.1 Date2.1
# 1   A1 2010-08-03  2.860    unknown       0       1
# 2   A2 2012-11-28  3.430 2015-10-22       0       0
# 3   A3 2009-12-13  4.650 2019-02-14       0       0
# 4   A4 2000-01-15  6.910 2010-11-25       0       0
# 5   A5 2003-03-01 -2.220    unknown       0       1
# 6   A6 2015-05-09  9.920 2017-03-12       0       0
# 7   A7 2020-07-11 23.410 2019-09-12       0       0
# 8   A8    unknown -0.032    unknown       1       1
# 9   A9 2011-01-04  8.840 2021-05-14       0       0
# 10 A10    unknown 10.110 2012-08-20       1       0