顧客のトランザクションデータを含むデータフレーム(pricedata)があります。顧客ごとにTNPごとにデータフレームを最高から最低までarrange()します。最高のTNPから下に移動し、列全体の合計TNPの60%に達するまで、TNPを累積して、それらすべての顧客にクラス= "A"を与えたいと思います。次に、列を続けて、列の合計TNPの60%から90%の間の後続の顧客にクラス= "B"を与え、残りをクラス= "C"にします。
これはデータです:
TNP Class
11847.47 C
11845.76 C
11840.06 C
11814.44 C
11775.24 C
11766.90 C
これは、私の目標を達成するために構築した関数です。
FUN.sthp.1 <- function(TNP) {
#The dataframe must be ordered by TNP for this cumsum function to work
Acut<-(.6*sum(pricedata$TNP))
Bcut<-(.9*sum(pricedata$TNP))
Ccut<-(1*sum(pricedata$TNP))
Summary.DF<- pricedata[pricedata$TNP>=TNP,]
total<-sum(Summary.DF$TNP)
Class<-ifelse(total<=Acut, "A",
ifelse(total<=Bcut & total>Acut, "B",
"C"))
return(Class)
}
次に、mapply()を使用してこの関数を呼び出し、TNPにフィードします。
すべての入力なしで同じことを実現する関数、または関数内の機能はありますか?
を使用cumsum
して累積合計を取得できます。これを合計で割りsum
ます。次に、を使用してレベルを割り当てることができますcut
。マージン(60%で何が起こるかなど)を処理するオプションがあり、を使用してヘルプファイルを見ることができます?cut
"TNP Class
11847.47 C
11845.76 C
11840.06 C
11814.44 C
11775.24 C
11766.90 C" -> myDat
out <- read.table(text = myDat, stringsAsFactors = FALSE, header = TRUE)
cut(cumsum(out$TNP)/sum(out$TNP), breaks =c(0,60,90,100)/100, labels = LETTERS[1:3])
[1] A A A B B C
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加