我经常使用cut()
将时间分类为白天/黑夜时间。因为cut()
不理解时钟时间大约为零,所以我首先将小时分成三组(每天晚上两个晚上),然后合并两个“夜晚”因子级别。这可以通过向levels()
两次提供相同的“夜晚”值来完成。 E.g。
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()
),但它仍然会返回三个级别,并且警告不推荐使用因子中的重复级别。
感谢您的建议。
答案 0 :(得分:2)
这可能太简单了,但为什么不这样做:
x <- c(4, 10, 23)
y = c("day", "night")[(x <= 6 | x > 22) + 1]
y
[1] "night" "day" "night"
答案 1 :(得分:2)
这可能就是你要找的东西。使用包ff
中的recodeLevels
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