Объединить уровни факторов в объекте ff

Я часто делю время на дневное / ночное время, используя cut(), Так как cut() не понимает, что часы идут около нуля, я сначала делю часы на три группы (ночь по обе стороны дня), а затем объединяю два уровня фактора "ночь". Это можно сделать, задав одинаковое значение "ночь" дважды levels(), Например

x <- c(4, 10, 23) # i.e. 4 am, 10 am, 11 pm
x <- cut(x
         , breaks = c(0, 6, 22, 23)
         , include.lowest = FALSE
         , labels = c("night2", "day", "night1"))
# [1] night2 day    night1
# Levels: night2 day night1

levels(x) <- c("night", "day", "night")
x
# [1] night day   night
# Levels: night day

Теперь я пытаюсь сделать то же самое с огромным набором данных в ff объект:

require(ff)
require(ffbase)

y <- ff(c(4, 10, 23))
y <- ff(cut(y
            , breaks = c(0, 6, 22, 23)
            , include.lowest = FALSE
            , labels = c("night2", "day", "night1")))
y
# ff (open) integer length=3 (3) levels: night2 day night1
#    [1]    [2]    [3] 
# night2 day    night1 

levels(y) <- c("night", "day", "night")
y
# ff (open) integer length=3 (3) levels: night day night
#  [1]   [2]   [3] 
# night day   night

Обратите внимание, что в этом случае levels() сохранил три факторных уровня, два из которых имеют одинаковую метку. recodeLevels выглядел многообещающе, но не совсем то же самое:

y <- recodeLevels(y, c("night", "day", "night"))
y
# ff (open) integer length=3 (3) levels: night day night
# [1] [2] [3] 
# NA  day NA  

Я также пробовал дублировать "ночные" ярлыки в cut() (на самом деле cut.ff()), но он по-прежнему возвращает три уровня плюс предупреждение о том, что дублированные уровни в коэффициентах не рекомендуются.

Спасибо за совет.

2 ответа

Решение

Это может быть то, что вы ищете. использование recodeLevels из пакета ff

require(ff)
y <- c(4, 10, 23)
y <- ff(cut(y, breaks = c(0, 6, 22, 23), include.lowest = FALSE, 
            labels = c("night2", "day", "night1")))
levels(y) <- c("night", "day", "night")
alllevs <- c("night", "day")
y <- recodeLevels(y, alllevs)
levels(y) <- alllevs
y
ff (open) integer length=3 (3) levels: night day
[1]   [2]   [3] 
night day   night 

Это может быть слишком просто, но почему бы просто не сделать:

x <- c(4, 10, 23)
y = c("day", "night")[(x <= 6 | x > 22) + 1]
y
[1] "night" "day"   "night"
Другие вопросы по тегам