问题描述
在下面的示例数据框中(原始由数千行和数百列组成),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")
给出
在分析中使用 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