我有一个数据框(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

09-25 21:57