Существует ли в R подходящая петля для подсчета количества точек соприкосновения за поездку и размещения конечной переменной точки продажи на последней точке соприкосновения? - PullRequest
1 голос
/ 18 апреля 2019

Я работаю с набором данных о поездках клиентов, который необходимо преобразовать в данные временных рядов на уровне дня. Чтобы дать краткий обзор данных:

PurchaseID    Timestamp               Touchpoint      Purchase
1              2015-08-07 19:16:59     1               1
1              2015-11-03 12:31:35     7               1
1              2015-11-03 12:39:22     3               1
2              2015-11-24 22:29:39     1               0 
2              2016-05-21 08:39:44     1               0
2              2016-06-15 15:48:20     4               0
...

Каждый уникальный номер в PurchaseID - это путешествие. Проблема здесь в том, что для каждой поездки, которая приводит к покупке, Покупка имеет 1 для каждой точки контакта в поездке. Я хочу изменить это значение только до конечной точки касания, имеющей 1, как в точке продажи, например:

PurchaseID    Timestamp               Touchpoint      Purchase    POS
1              2015-08-07 19:16:59     1               1          0
1              2015-11-03 12:31:35     7               1          0
1              2015-11-03 12:39:22     3               1          1
2              2015-11-24 22:29:39     1               0          0
2              2016-05-21 08:39:44     1               0          0 
2              2016-06-15 15:48:20     4               0          0
...

Я рассуждал, что самым простым способом было бы создание цикла, который заполняет новую переменную JourneyLength (которую я также могу использовать для последующего анализа), которая подсчитывает количество шагов в путешествии. Например:

PurchaseID    Timestamp               Touchpoint      Purchase    JourneyLength
1              2015-08-07 19:16:59     1               1          1
1              2015-11-03 12:31:35     7               1          2
1              2015-11-03 12:39:22     3               1          3

...

Используя новый цикл, можно использовать максимум каждого уникального идентификатора покупки, чтобы заполнить POS единицей за каждый последний (и, следовательно, максимальный) шаг поездки, если будет совершена покупка.

То, что я пробовал до сих пор, не дало желаемого результата:

CJDsub$JLength <- 0 # journey length counter, first set to 0
for (x in 1:length(CJDsub$PurchaseID)) {
  if(unique(x))
    CJDsub$JLength <- CJDsub$JLength+1
  else next
  }

Кроме того, пакет dplyr также не привел к желаемым результатам. (Это пропускает часть подсчета шагов)

library(dplyr)
CJDsub %>% group_by(PurchaseID) %>% summarize(
  timestamp <- timestamp,
  purchase_any <- sum(purchase_any)
)

Есть ли у кого-нибудь предложения, как решить эту проблему и получить правильную структуру данных? Заранее спасибо!

Опять же, это то, что я хочу в качестве результата:

PurchaseID    Timestamp               Touchpoint      Purchase    POS
1              2015-08-07 19:16:59     1               1          0
1              2015-11-03 12:31:35     7               1          0
1              2015-11-03 12:39:22     3               1          1
2              2015-11-24 22:29:39     1               0          0
2              2016-05-21 08:39:44     1               0          0 
2              2016-06-15 15:48:20     4               0          0
...

Ответы [ 2 ]

0 голосов
/ 19 апреля 2019

Рассмотрим ave для расчета максимальной даты, затем условно присвойте Pos с ifelse:

df <- within(df, {
    MaxDate <- ave(Timestamp, PurchaseID, FUN=max)
    POS <- ifelse(Timestamp == MaxDate & Purchase == 1, 1, 0)

    rm(MaxDate)
})

df
#   PurchaseID           Timestamp Touchpoint Purchase POS
# 1          1 2015-08-07 19:16:59          1        1   0
# 2          1 2015-11-03 12:31:35          7        1   0
# 3          1 2015-11-03 12:39:22          3        1   1
# 4          2 2015-11-24 22:29:39          1        0   0
# 5          2 2016-05-21 08:39:44          1        0   0
# 6          2 2016-06-15 15:48:20          4        0   0
0 голосов
/ 18 апреля 2019

Вот как я подхожу к этому с пакетом data.table:

library(data.table)
# data, convert to data.table
df <- data.frame(PurchaseId=c(rep(1,3), rep(2,3)),
                 Timestamp=1:6,
                 Touchpoint=c(1,7,3),
                 Purchase=c(rep(1,3), rep(0,3)))
dt <- as.data.table(df)

# create template value
dt[, POS := 0]
# find maximum timestamp and store
dt[, Max.Timestamp := max(Timestamp), by=PurchaseId]
# where timestamp is maximal and purchase has been made, then set to 1
dt[Timestamp == Max.Timestamp & Purchase > 0, POS := 1]

# clean
dt[, Max.Timestamp := NULL]
out.df <- as.data.frame(dt)
out.df
...