1

データセット内の特定の顧客の値の傾向 (「正/負/混合」、以下の定義を参照) を識別できる関数を作成する方法を探しています。

次のトランザクション データがあります。すべての顧客は、それぞれ 3 ~ 13 のトランザクションを持っています。

customer_ID transaction_num sales
Josh         1              $35
Josh         2              $50
Josh         3              $65
Ray          1              $65
Ray          2              $52
Ray          3              $49
Ray          4              $15
Eric         1              $10 
Eric         2              $13
Eric         3              $9

次のように新しいデータフレームにデータを入力する関数をRで書きたいと思います

Customer_ID     Sales_Slope  
Josh              Positive
Ray               Negative
Eric               Mixed

どこ:

Josh の傾きはです。これは、ショッピング ポイントが追加されるたびに、すべての取引販売コストが増加し続けるためです。

Ray の勾配はになります。これは、すべての取引の販売コストが、ショッピング ポイントが追加されるたびに減少し続けるためです。

エリックの傾きはまちまちです。なぜなら、彼の取引販売コストはすべて変動するからです...明確な傾向がない...

私はこれを自分でやろうとかなり広範囲に試みましたが、行き詰まっています..ここに私がまとめることができたいくつかの疑似コードがあります

counter = max(transaction_num)
while counter >= 0 
 if sales at max transaction_num are greater than sales at max transaction_num - 1) 
   then counter = counter - 1 ; else "not positive slope trend"
4

2 に答える 2

2

みたいなことから始めればいいと思います。 data.table通常、より大きなデータセットではかなり効率的です。

#Make fake data
require("data.table")
data <- data.table(customer_ID=c(rep("Josh",3),rep("Ray",4),rep("Eric",3)),
                   sales=c(35,50,65,65,52,49,15,10,13,9))
data[,transaction_num:=seq(1,.N),by=c("customer_ID")]

それでは実際のコードです。

data <- data.table(data)

#Calculate difference in rolling two time periods
rolled.up <- data[,list(N.Minus.1=.N-1,Change=list(
  sales[transaction_num+1]-sales[transaction_num])),
  by=c("customer_ID")]

#Sum up positive and negative values
rolled.up[,Pos.Values:=as.numeric(lapply(Change,FUN=function(x) {sum(1*(x>0),na.rm=T)}))]
rolled.up[,Neg.Values:=(N.Minus.1-Pos.Values)]

#Make Sales Slope variable
rolled.up[,Sales_Slope:=ifelse(Pos.Values>0 & Neg.Values==0,"Positive",
      ifelse(Pos.Values==0 & Neg.Values>0,"Negative","Mixed"))]

#Make final table
final.table <- rolled.up[,list(customer_ID,Sales_Slope)]
final.table

#      customer_ID Sales_Slope
# 1:        Josh    Positive
# 2:         Ray    Negative
# 3:        Eric       Mixed

#You can always merge this result back onto your main dataset if you want
data <- merge(x=data,y=final.table,by=c("customer_ID"),all.x=T)
于 2014-05-12T03:35:28.583 に答える
2

簡単な答えは、 を使用することdiffです。次の値から現在の値を差し引くだけなので、すべてがdiff(x)ゼロより大きい場合は増加しており、その逆も同様です。まず、データを読み取ります。

# Read in some data.
data<-read.table(textConnection('customer_ID transaction_num sales
Josh         1              $35
Josh         2              $50
Josh         3              $65
Ray          1              $65
Ray          2              $52
Ray          3              $49
Ray          4              $15
Eric         1              $10 
Eric         2              $13
Eric         3              $9'),header=TRUE,stringsAsFactors=FALSE)

data$sales<-as.numeric(sub('\\$','',data$sales))

今コード:

# Diff subtracts next value from current in a diff.
# so diff(c(1,2,3,4)) is c(1,1,1)
direction<-function(x){
  if(all(diff(x)>0)) return('Increasing')
  if(all(diff(x)<0)) return('Decreasing')
  return('Mixed')
}

# If you want a vector.
c(by(data$sales,data$customer_ID,direction))
#   Eric         Josh          Ray 
# "Mixed" "Increasing" "Decreasing"

# If you want to a little data frame.
aggregate(sales~customer_ID,data,direction)
#   customer_ID      sales
# 1        Eric      Mixed
# 2        Josh Increasing
# 3         Ray Decreasing
于 2014-05-12T03:12:30.957 に答える