我有一个数据框(priceata),其中包含客户的交易数据。我按TNP对每个客户从最高到最低排列()数据框。我想从最高的TNP向下移动,累积TNP,直到我达到整个列的总TNP的60%,并为所有这些客户提供一个类别=“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