合并ff对象中的因子级别

时间:2014-02-03 22:26:47

标签: r ff ffbase

我经常使用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()),但它仍然会返回三个级别,并且警告不推荐使用因子中的重复级别。

感谢您的建议。

2 个答案:

答案 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