R 一年中的每一天都有一个热编码/二进制列,并选择它们

R 一年中的每一天都有一个热编码/二进制列,并选择它们,r,filtering,calculated-columns,R,Filtering,Calculated Columns,我有一个飞行数据的R数据集。我需要向该数据集中添加365列,一年中的每一天一列,如果条目的数据[I]$FlightDate对应于一年中的那一天,则值为1,否则为0 以前,我使用lubridate从FlightDate字符串中提取了一年中的某一天 data$DayOfYear <- yday(ymd(data$FlightDate)) 生成365个二进制列并选择与SVD兼容的字段后,对输出数据行进行采样 { DayOfYear1: 0, ... DayOfYear9: 0,

我有一个飞行数据的R数据集。我需要向该数据集中添加365列,一年中的每一天一列,如果条目的数据[I]$FlightDate对应于一年中的那一天,则值为1,否则为0

以前,我使用lubridate从FlightDate字符串中提取了一年中的某一天

data$DayOfYear <- yday(ymd(data$FlightDate))
生成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和时隙进行了一次热编码,并继续执行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))

@germcd的可能重复该问题似乎是关于交换一些行/列,但在我的情况下,我希望保留数据集的相同条目,并根据一列的内容再添加365列。我也不想把任何条目组合在一起。啊,对了,我看到了区别,可能会有帮助
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))