在R中切割功能 - 独占或我是否重复计算?

时间:2011-11-22 21:09:17

标签: r

基于previous question我问过哪个@Andrie回答,我对cut函数和标签的用法有疑问。

我想根据用户登录的次数获取摘要统计信息。

这是我的数据:

  # Get random numbers
  NumLogin <- round(runif(100,1,50))

  # Set the login range     
  LoginRange <- cut(NumLogin, 
       c(0,1,3,5,10,15,20,Inf), 
       labels=c('1','2','3-5','6-10','11-15','16-20','20+')
       )

现在我有了我的LoginRange,但我不确定cut函数实际上是如何工作的。我想找到已登录1次,2次,3-5次等的用户,同时仅包括用户,如果他们在该范围内。 cut功能是否包括3次(在2个桶和3-5个桶中)?如果我查看我的示例,我可以看到登录3次的用户,但他们cut为“2”。我查看了文档和我拥有的每本R本书,但没有运气。我究竟做错了什么?

另外 - 作为使用问题 - 我应该将LoginRange附加到我的数据框吗?如果是这样,最好的方法是什么?

DF <- data.frame(NumLogin, LoginRange)

由于

1 个答案:

答案 0 :(得分:18)

cut()函数定义的区间(默认情况下)在右侧关闭。要了解这意味着什么,请尝试以下方法:

cut(1:2, breaks=c(0,1,2))
# [1] (0,1] (1,2]

如您所见,整数1包含在(0,1]范围内,而不在(1,2]范围内。它不会被重复计算,并且对于任何超出您定义的bin的输入值,cut()将返回值NA

在处理整数值数据时,我倾向于在整数之间设置断点,以避免绊倒自己。实际上,使用您的数据执行此操作(如下所示),可以发现第二个和第三个二进制文件实际上名称不正确,这很好地说明了这一点!

LoginRange <- cut(NumLogin, 
   c(0.5, 1.5, 3.5, 5.5, 10.5, 15.5, 20.5, Inf),
   # c(0,1,3,5,10,15,20,Inf) + 0.5, 
   labels=c('1','2-3','4-5','6-10','11-15','16-20','20+')
   )