frank() 在R中形成多列
frank () form multiple columns in R
我偶然发现了 frank() 的问题。我有一个包含多个列的 data.table
,包含 itemID 及其特征。现在我想根据物品的特点来排序:total
和 RD
,它们都是值。两列的值越高,排名越高。此外,我想分别对每个 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 个指数相加并重复这些指数的总和,同时将最高排名给予那些先前指数总和最大的指数。
我偶然发现了 frank() 的问题。我有一个包含多个列的 data.table
,包含 itemID 及其特征。现在我想根据物品的特点来排序:total
和 RD
,它们都是值。两列的值越高,排名越高。此外,我想分别对每个 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 个指数相加并重复这些指数的总和,同时将最高排名给予那些先前指数总和最大的指数。