2016-01-16 2 views
0

У меня есть набор данных полетных данных R. Мне нужно добавить 365 столбцов в этот набор данных, по одному на каждый день года, со значением 1, если data[i]$FlightDate записи соответствует этому Дню года, 0 в противном случае (see this question for why).Один горячий кодирующий/бинарный столбцы для каждого дня в году и их выбор

Раньше мне удалось извлечь день года из строки FlightDate с помощью lubridate

data$DayOfYear <- yday(ymd(data$FlightDate)) 

Как бы идти о создании каждый 365 столбцов, и держать только те столбцы (наряду с некоторыми другими) для будущее СВД? Мне действительно нужно будет повторить то же самое в течение часов в день (что я, вероятно, разделил на диапазоны 30 или 10 минут), поэтому дополнительные 48-120 однострочных столбцов для другой переменной нужно будет добавить позже.

Примечание: мой набор данных содержит около 500к рейсов в месяц, (так что около 16k рейсов для одного dayOfTheYear, если я просто взять один год данных), и имеет 100 переменных (столбцов)

Пример строки data[1,] ввода данных :

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

Пример строка выходных данные (после генерации 365 двоичной CO и выбора полей, совместимых с SVD)

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

EDIT

Предположим, что моя матрица входных данных выглядит, что

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 
+0

Возможный дубликат [Изменить данные из длинного в широкий формат R] (http: // stackoverfl ow.com/questions/5890584/reshape-data-from-long-to-wide-format-r) – germcd

+0

@germcd Этот вопрос, похоже, касается замены некоторых строк/столбцов, но в моем случае я хочу сохранить те же записи моего набора данных и просто добавьте еще 365 столбцов на основе содержимого одного столбца. Я также не хочу группировать записи. –

+0

ах, я вижу разницу, [это] (http://stackoverflow.com/questions/13727918/r-convert-row-data-to-binary-columns) может помочь – germcd

ответ

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)) 

 Смежные вопросы

  • Нет связанных вопросов^_^