Объединить уровни факторов в объекте 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"