Вырезать функцию в 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)
?
Спасибо
Ответы
Ответ 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+')
)