我有一个数据框(pricingata),其中包含客户的交易数据。我安排()TNP为每个客户从最高到最低的数据框架。我想从最高的TNP向下移动,累积TNP,直到我达到整个柱的总TNP的60%,并给所有这些客户一个等级=" A"。然后继续沿着列继续向后续客户提供60%到90%的列总TNP,一个类=" 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。
是否有函数或函数中的某个功能在没有所有输入的情况下会实现相同的功能?
答案 0 :(得分:2)
您可以使用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