我有一个飞行数据的R数据集。我需要向此数据集添加 365 列,每个列对应一年中的一天,如果条目的data[i]$FlightDate
对应于该一年中的某一天,则值为 1,否则为 0(请参阅此问题了解原因)。
以前,我设法使用润滑剂从 FlightDate 字符串中提取一年中的某一天
data$DayOfYear <- yday(ymd(data$FlightDate))
我将如何生成每个 365 列,并仅保留这些列(以及其他一些列)以供将来的 SVD 使用?我实际上需要在一天中的几个小时重复相同的操作(我可能会将其分成 30 或 10 分钟的范围),因此稍后必须为不同的变量添加额外的 48-120 个单热列。
注意:我的数据集每月包含大约 500k 个航班(如果我只获取一年的数据,那么一天大约 16k 个航班),并且有 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
这是我的最终代码,它为一年中的一天和时隙进行一个热编码,然后进入 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))