frank() 在R中形成多列

frank () form multiple columns in R

我偶然发现了 frank() 的问题。我有一个包含多个列的 data.table,包含 itemID 及其特征。现在我想根据物品的特点来排序:totalRD,它们都是值。两列的值越高,排名越高。此外,我想分别对每个 type 进行排名。

testDT <- testDT[,rankRD := frank(RD), by = c("type")]
testDT <- testDT[,rankTotal := frank(total), by = c("type")]

我已经建立了一个解决方案:

Sumrank <- rowSums(testDT[,c("rankRD", "rankTotal")])
testDT <- cbind(testDT, Sumrank)
testDT <- testDT[,rank := frank(-Sumrank), by = c("type")]

但是,这不是一个非常优雅的解决方案。我一直在寻找一个更好的解决方案,它也适用于大数据 - 理想情况下 data.table

示例数据:

item <- c(rep(c("plan20, plan21, plan22"), 2), "plan23", "plan24", "plan25")
item <- c("plan20", "plan21", "plan22", "plan20", "plan21", "plan22", "plan23","plan24", "plan25")
total <- c(rep(c(3000, 5000, 7000), 2), c(5000, 5000, 2000))
RD <- c(rep(c(500, 300, 700), 2), c(500, 200, 100))
type <- c(rep("A", 3), rep("B", 3), rep("C", 3))

这里有一个等权重排名计算的选项:

#convert type into integer type for easier joining later and
#create an running index for RD
testDT[order(type, RD), c("tid", "rd") := .(rleid(type), rleid(type, RD))]

#create an running index for total
testDT[order(tid, total), rt := rleid(tid, total)]

#create an running index for sum of indices in descending order
testDT[order(tid, -(rd+rt)), rr := rleid(tid, -(rd+rt))]

#reset the index to start with 1 for each type
testDT[testDT[, .(m=max(rr)), tid][, tid := tid + 1L], on=.(tid), rr := rr - m]

输出:

     item type total  RD rankRD rankTotal Sumrank rank tid rd rt rr
1: plan20    A  3000 500      2       1.0     3.0  2.5   1  2  1  2
2: plan21    A  5000 300      1       2.0     3.0  2.5   1  1  2  2
3: plan22    A  7000 700      3       3.0     6.0  1.0   1  3  3  1
4: plan20    B  3000 500      2       1.0     3.0  2.5   2  5  4  2
5: plan21    B  5000 300      1       2.0     3.0  2.5   2  4  5  2
6: plan22    B  7000 700      3       3.0     6.0  1.0   2  6  6  1
7: plan23    C  5000 500      3       2.5     5.5  1.0   3  9  8  1
8: plan24    C  5000 200      2       2.5     4.5  2.0   3  8  8  2
9: plan25    C  2000 100      1       1.0     2.0  3.0   3  7  7  3

解释:

它首先按 type 和任一数字列排序,然后使用 rleid 创建索引。然后它将这 2 个指数相加并重复这些指数的总和,同时将最高排名给予那些先前指数总和最大的指数。