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

mik*_*sey 14 r

基于我之前提出的一个问题,@ 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+')
       )
Run Code Online (Sandbox Code Playgroud)

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

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

DF <- data.frame(NumLogin, LoginRange)
Run Code Online (Sandbox Code Playgroud)

谢谢

Jos*_*ien 18

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

cut(1:2, breaks=c(0,1,2))
# [1] (0,1] (1,2]
Run Code Online (Sandbox Code Playgroud)

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

在处理整数值数据时,我倾向于在整数之间设置断点,以避免绊倒自己.实际上,使用您的数据执行此操作(如下所示),显示第2和第3个分箱实际上被错误地命名,这很好地说明了这一点!

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+')
   )
Run Code Online (Sandbox Code Playgroud)

  • 我更喜欢在左边关闭间隔,所以使用Hmisc包中的cut2.(比总是键入`更容易,正确= FALSE,`.) (6认同)
  • “ggplot2”中的“cut_number”和“cut_interval”也是涵盖类似领域的有用快捷方式 (2认同)