基于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)
由于
答案 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+')
)