Я искал arround SO и другие блоги по науке о данных и программированию, но я не нашел ответа для своей конкретной потребности. Поэтому, если вы обнаружите, что этот вопрос дублируется, пожалуйста, будьте любезны и укажите мне источник информации и закройте / удалите этот вопрос.
Мои реальные данные будут иметь несколько тысяч строк, поэтому я отображаю здесь только небольшой набор вымышленных данных, очень похожих на мои исходные данные:
Data <- data.frame(
ID = c(1,1,1,1,2,2,2,2,3,3),
Year = c(2014,2015,2016,2017,2007,2008,2009,2010,2016,2017),
CmSm = c(1,2,1,0,1,0,0,1,1,0),
Index = c(1,2,3,4,1,2,3,4,1,2)
)
Набор данных, который я хотел бы получить в конце:
Dataout <- data.frame(
ID = c(1,1,1,1,2,2,2,2,3,3),
Year = c(2014,2015,2016,2017,2007,2008, 2009,2010,2016,2017),
CmSm = c(1,2,1,0,1,0,0,1,1,0),
Index = c(1,2,3,4,1,2,3,4,1,2),
Cassification = c("New", "Existing", "Existing", "Lost", "New", "Lost","","Returning", "New","Lost")
)
Моя лучшая попытка на данный момент выглядит следующим образом:
Dataout$Status <- ave( Dataout$CmSm,
Dataout$ID,
FUN = function(x) ifelse( Dataout$Index == 1, "New", ifelse( x[-1] == 0 & x > 0, "Returning", ifelse( x[-1] == 0 & x == 0, "", ifelse( x[-1] > 0 & x == 0, "Lost", "Existing" ) ) ) ) )
Однако у этой попытки есть 2 проблемы:
Неправильно классифицируется;
Когда я использую этот код в моих исходных данных с тысячами и тысячами строк, R выполняет 15 минут вычислений и не получает никаких результатов (я думаю, что ifelse не помогает ...), а не упомянуть, что память, выделенная для процесса, смехотворно высока.
Объяснение рассматриваемой проблемы и правила классификации:
Учитывая список идентификаторов элементов, год и индекс идентификатора элемента, я хотел бы классифицировать эти элементы по следующим категориям: «Новый», «Существующий», «Возвращение», «Потерянный» и «» или ноль или нет.
Правила для этой классификации следующие (CmSm-1 представляет непосредственное предыдущее значение относительно текущего значения CmSm):
Если индекс == 1, то «новый».
Если индекс> 1, то:
если CmSm-1 == 0 и CmSm> 0, то «Возвращается».
Если CmSm-1 == 0 и CmSm == 0, то "" -> это напоминает случай, когда у объекта не было зарегистрированных событий.
Если CmSm-1> 0 и CmSm> 0, то «Существующий».
Если CmSm-1> 0 и CmSm == 0, то «потерян».
Пожалуйста, дайте мне знать, если вы нашли мое объяснение правил запутанным, чтобы у меня была возможность уточнить их для вас.
Заранее благодарю за любую помощь, которую вы можете оказать.
Ура!