1

異なる分割のトランザクション間の平均遅延を計算したいと考えています。解決策は既にありますが、別の方法で遅延を計算する必要があります。

データセットは次のようになります。

customer_id      transaction_date       type      sign     period  
    A               01/01/15              A         C     30 days    
    A               05/01/15              A         C     30 days    
    A               10/01/15              B         D     30 days    
    A               25/01/15              B         D     30 days    

transaction_data = structure(list(customer_id = c("A", "A", "A", "A"), 
transaction_date = c("01/01/15", 
"05/01/15", "10/01/15", "25/01/15"), type = c("A", "A", "B", 
"B"), sign = c("C", "C", "D", "D"), period = c("30 days", "30 days", 
"30 days", "30 days")), .Names = c("customer_id", "transaction_date", 
"type", "sign", "period"), row.names = c(NA, -4L), class = "data.frame")

解決策 古い方法

私が以前行っていたのは、次のように、最初に後続のトランザクション間の遅延を計算することでした:

# Delay between subseauent transactions
library(data.table)
setDT(transaction_data)[,delay_in_transactions_days:= c(0, diff.Date(transaction_date)), .(customer_id)]

# Convert seconds to days
transaction_data <- mutate(transaction_data, delay_in_days = delay_in_transactions_days/86400)
# Convert to integer
transaction_data$delay_in_days <- as.integer(transaction_data$delay_in_days)

次に、dcast を使用して、各トランザクション遅延の各分割の平均を計算します。

dcast(setDT(transaction_data), customer_id ~ paste0("avg_delay_",period), value.var = "delay_in_days", mean)

問題の新しい方法

遅延を計算するために使用したい新しい方法は、次の式によるものです。

クライアントごと: (最新のトランザクション - 最初のトランザクション) / (トランザクション数 - 1)

もちろん問題は、すべてのトランザクションの遅延になるため、期間ごとに遅延を計算できないことです。代わりに、特定のタイプまたは記号、または分割の組み合わせの期間ごとの遅延として計算する必要があります。

問題にどのようにアプローチするかについてのアイデアはありますか?

期待される出力

customer_id   av.delay_30days  av.delay_30_days_TYPE_A  av.delay_30_days_TYPE_B

     A               8                   4                         15
4

1 に答える 1

1

パッケージから使用dcast()して参加する次のアプローチを試してください。data.table

OPによって与えられた式

(最新のトランザクション - 最初のトランザクション) / (トランザクション数 - 1)

として実装されdiff(range(transaction_date)) / (length(transaction_date) - 1L)ます。

library(data.table)
setDT(transaction_data)

# coerce transaction_date to class Date
transaction_data[, transaction_date := lubridate::dmy(transaction_date)]

# compute average delay for each customer according to OP's formula
avg_dly_total <- transaction_data[
  , .(av.delay_30days = diff(range(transaction_date), units = "days") / (.N - 1L)), 
  by = customer_id]

avg_dly_total
#   customer_id av.delay_30days
#1:           A          8 days

# compute average delay by Type for each customer
avg_dly_type <- transaction_data[
  , .(av.delay_30days = diff(range(transaction_date), units = "days") / (.N - 1L)), 
  by = .(customer_id, type)]

avg_dly_type
#   customer_id type av.delay_30days
#1:           A    A          4 days
#2:           A    B         15 days

# cast type results from long to wide
value_var <- "av.delay_30days"
temp <- dcast(avg_dly_type, customer_id ~ paste0(value_var, "_TYPE_", type), 
              value.var = value_var)

temp
#   customer_id av.delay_30days_TYPE_A av.delay_30days_TYPE_B
#1:           A                 4 days                15 days

# join with totals
result <- avg_dly_total[temp, on = "customer_id"]

最終結果は、期待される出力とほぼ同じように見えます

 result
#   customer_id av.delay_30days av.delay_30days_TYPE_A av.delay_30days_TYPE_B
#1:           A          8 days                 4 days                15 days
于 2017-04-18T10:15:27.143 に答える