Which.max не работает, но which.min (в R) - PullRequest
0 голосов
/ 04 июля 2018

У меня есть таблица со списком транзакций по различным кампаниям (или проектам). То, что я пытаюсь сделать, это определить, когда каждая кампания была запущена, основываясь на дне первой транзакции в каждой. Данные охватывают все транзакции во всех кампаниях, причем релевантными являются только следующие два столбца: Campaign.ID (числовой), Created.At (гггг-мм-дд). Вот что у меня на данный момент:

temp$Recency = as.integer(today() - temp$Created.At) # Get number of days ago
df = temp %>% # Multiple transactions per user - we only need the most recent
  group_by(Campaign.ID) %>% # Group transactions together by campaign
  slice(which.max(temp$Recency)) # Find first transaction - ie biggest Recency value
df = as.data.frame(df)

Поэтому я создаю столбец temp $ Recency, чтобы изменить столбец даты на целое число дней с сегодняшнего дня. Затем я группирую данные на основе их идентификатора кампании и пытаюсь выбрать только первую транзакцию для каждого, т.е. тот, который имеет наибольшее значение в temp $ Recency

Меня удивляет то, что этот код работает нормально, если я использую which.min для поиска последней транзакции каждой кампании и возвращает фрейм данных с одним (самым последним) экземпляром для каждой кампании. Тем не менее, когда я пытаюсь это сделать с помощью которого .max возвращает пустой фрейм данных.

Я не понимаю причину этого, конечно, если which.min работает как положено, то which.max тоже должен. Я пытался найти ответ, но ни с кем не сталкивался с такой же проблемой. Любая помощь будет оценена

РЕДАКТИРОВАТЬ:

Данные выглядят примерно так:

Created.At Campaign.ID Recency
2018-06-21        1883      13
2018-06-21        1890      13
2018-06-20        1883      14

Около 3000 записей в 50-60 различных кампаниях

which.min возвращает что-то вроде этого:

Created.At Campaign.ID Recency
2017-07-02          19     367
2017-05-25          91     405
2017-06-06         344     393
2017-06-30         451     369
2017-06-30         509     369
2017-08-16         551     322

Мне нужно то же самое, но для которого. Max

PS. Извините, первый вопрос здесь, я не очень привык к этому. Если что-то неясно, дайте мне знать

1 Ответ

0 голосов
/ 04 июля 2018

Вы должны удалить temp$ из вашего slice() вызова.

Как таковой, which.max(temp$Recency) вернет индекс максимального значения во всех данных (не один для каждых Campaign.ID), который затем выходит за пределы для любой из отдельных групп, определенных как Campaign.ID ( Я удивлен, что это не выдает ошибку).

Выражение в slice() оценивается в контексте данных. Однако, поскольку ваши данные не содержат столбец с именем temp, при оценке вызова вместо него в глобальной среде обнаруживается temp$Recency. В результате код, который у вас есть, эквивалентен:

max_row <- which.max(temp$Recency)
temp %>% 
  group_by(Campaign.ID) %>% 
  slice(max_row)

Тогда любые группы с менее чем max_row наблюдениями просто не учитываются.

Однако, если вы напишите slice(which.max(Recency)), тогда Recency будет найден в виде столбца в теперь сгруппированных данных и будет корректно оценен в каждой группе.

Итак, чтобы получить желаемый результат, просто напишите:

df %>%
  group_by(Campaign.ID) %>%
  slice(which.max(Recency))

как прокомментировал @LAP.

Относительно того, почему which.min, похоже, сработало, возможно, потому, что строка с глобальным минимумом, вероятно, одна из первых (может быть, даже первая?), Так что большинство (если не все) групп имеют по крайней мере столько строк То есть если which.min(temp$Recency) == 1, вы всегда будете получать только первый ряд в каждой подгруппе.

...