一年中的每一天都有一个热编码/二进制列和 select 它们

One hot encoding / binary columns for each day of the year and select them

我有一个飞行数据的 R 数据集。我需要向该数据集添加 365 列,每一列对应一年中的每一天,如果条目的 data[i]$FlightDate 对应于这一年的那一天,则值为 1,否则为 0 (see this question for why).

之前我曾设法使用 lubridate

从 FlightDate 字符串中提取年份
data$DayOfYear <- yday(ymd(data$FlightDate))

我将如何着手生成每 365 列,并只保留这些列(以及其他一些列)用于将来的 SVD?实际上,我需要在一天中的几个小时内重复相同的操作(我可能会将其分成 30 或 10 分钟的范围),因此稍后必须为不同的变量添加额外的 48-120 个单热列。

注意:我的数据集每月包含大约 50 万次航班(如果我只获取一年的数据,那么一年中一天大约有 16,000 次航班),并且有 100 个变量(列)

示例输入数据行 data[1,]:

{
  DayOfYear: 10, 
  FieldGoodForSvd1 : 235
  FieldBadForSvd2 : "some string"
  ...
} 

示例输出数据行(在生成 365 个二进制列并选择与 SVD 兼容的字段之后)

{
  DayOfYear1: 0,
  ... 
  DayOfYear9: 0, 
  DayOfYear10: 1, // The flight had taken place on that DayOfYear
  DayOfYear11: 0, 
  ...
  DayOfYear365: 0, 
  FieldGoodForSvd1 : 235
} 

编辑

假设我的输入数据矩阵是这样的

DayOfYear ; FieldGoodForSvd1 ; FieldBadForSvd2

1         ; 275              ; "los angeles"
1         ; 256              ; "san francisco"
5         ; 15               ; "chicago"

最终输出应该是

FieldGoodForSvd1 ; DayOfYear1 ; DayOfYear2 ; ... ; DayOfYear4 ; DayOfYear5 ; DayOfYear6 ; ... ; DayOfYear365

275              ;    1       ;      0     ; ... ; 0           ; 0         ; 0          ; ... ; 0
256              ;    1       ;      0     ; ... ; 0           ; 0         ; 0          ; ... ; 0
5                ;    0       ;      0     ; ... ; 0           ; 1         ; 0          ; ... ; 0

这是我的最终代码,它对 DayOfYear 和 TimeSlot 进行一次热编码,然后进行 svd

dsan = (d[!is.na(d$FieldGoodForSvd1) & d[!is.na(d$FieldGoodForSvd2),])

# We need factors to perform one hot encoding
dsan$DayOfYear <- as.factor(yday(ymd(dsan$FlightDate)))
dsan$TimeSlot <- as.factor(round(dsan$DepTime/100)) # in my case time slots were like 2055 for 20h55

dSvd= with(dsan,data.frame(
  FieldGoodForSvd1,
  FieldGoodForSvd2,
  # ~ performs one hot encoding (on factors), -1 removes intercept term
  model.matrix(~DayOfYear-1,dsan),
  model.matrix(~TimeSlot-1,dsan)
))
theSVD = svd(scale(dSvd))