Подтвердить что ты не робот

Вырезать функцию в 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+')
       )

Теперь у меня есть свой LoginRange, но я не уверен, как работает функция cut. Я хочу найти пользователей, которые вошли в систему 1 раз, 2 раза, 3-5 раз и т.д., Включая только пользователя, если они находятся в этом диапазоне. Является ли функция cut в том числе 3 раза (в 2 ведрах и 3-5 ведрах)? Если я посмотрю в своем примере, я могу видеть пользователя, который вошел в систему 3 раза, но они cut как "2". Я просмотрел документацию и каждую R книгу, которую я имею, но не повезло. Что я делаю не так?

Также - как вопрос использования - следует ли привязать LoginRange к кадру данных? Если да, то какой лучший способ сделать это?

DF <- data.frame(NumLogin, LoginRange)

?

Спасибо

4b9b3361

Ответ 1

Интервалы, определенные функцией cut(), по умолчанию закрыты справа. Чтобы узнать, что это значит, попробуйте следующее:

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

Как вы можете видеть, целое число 1 входит в диапазон (0,1], а не в диапазоне (1,2]. Он не получает двойной подсчет, и для любого входного значения, выходящего за пределы выбранных бункеров, 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+')
   )