Вырезать функцию в R - эксклюзив или я двойной счет? - PullRequest
14 голосов
/ 23 ноября 2011

Исходя из предыдущего вопроса Я спросил, на который @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 Ответ

18 голосов
/ 23 ноября 2011

Интервалы, определенные функцией 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+')
   )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...