如何创建基于自定义规则的决胜局?

时间:2018-10-28 11:27:02

标签: r if-statement tidyverse

样本df:

set.seed(1)
df <- tibble(name = fruit[1:10],
             A = rpois(10, 10),
             B = rpois(10, 2),
             C = rpois(10, 6),
             D = rpois(10, 2))

           name  A B C D A_rank AB_rank ABC_rank ABCD_rank
1         apple  8 1 8 2      9       9        8         7
2       apricot 10 1 7 3      7       7        4         5
3       avocado  7 0 8 0     10      10        9        10
4        banana 11 1 3 2      4       5        9         9
5   bell pepper 14 4 7 3      1       1        1         1
6      bilberry 12 1 5 3      3       3        4         5
7    blackberry 11 2 8 2      4       3        3         3
8  blackcurrant  9 2 7 4      8       7        4         4
9  blood orange 14 2 8 2      1       2        2         2
10    blueberry 11 1 6 1      4       5        4         7

这是基于我问previously的问题,我想在此进行逐行计算,以逐步累积每一列的总和来计算等级,其中较高的总和=较低的等级。

df <- bind_cols(df, apply(-apply(df[, -1], 1, cumsum), 1, min_rank) %>% 
          as_tibble() %>% 
          rename(A_rank = A, AB_rank = B, ABC_rank = C, ABCD_rank = D))

但是,我现在想要的是结合基于R或dplyr不提供的基于规则的自定义平局决胜功能。在每个等级计算中,我的决胜局功能的规则是:

  • 在最多活动中得分最高的水果获胜
  • 如果仍然保持平局,那么单列中得分最高的水果将获得更高的位置。
    • 如果平局仍然存在,则比较第二高的点数,依此类推。
  • 否则,请使用min_rank。

因此,在我的df中,仅针对A查看第一级计算:

df %>% select(name, A, A_rank) %>% arrange(A_rank)
           name  A A_rank
1   bell pepper 14      1
2  blood orange 14      1
3      bilberry 12      3
4        banana 11      4
5    blackberry 11      4
6     blueberry 11      4
7       apricot 10      7
8  blackcurrant  9      8
9         apple  8      9
10      avocado  7     10

在这里,正如我们刚开始排名第一时,得分并列的水果使用min_rank,这很好,因为没有更多信息。

将逐行列AB相加后:

df %>% select(name, A, B, AB_rank) %>% arrange(AB_rank)
           name  A B AB_rank
1   bell pepper 14 4       1
2  blood orange 14 2       2
3      bilberry 12 1       3
4    blackberry 11 2       3
5        banana 11 1       5
6     blueberry 11 1       5
7       apricot 10 1       7
8  blackcurrant  9 2       7
9         apple  8 1       9
10      avocado  7 0      10

在这里,对于水果bilberryblackberry,它们各自在一个列中的编号要比另一种水果高,因此仍然有平局,我想继续讲第二条规则,其中bilberry会排名3,因为它们在A列中具有较高的数字12,而blackberry会排名4

对于bananablueberry,由于在应用我的两个规则后仍将保持平局,因此请使用min_rank,在这里很好。

预期产量

           name  A B AB_rank
1   bell pepper 14 4       1
2  blood orange 14 2       2
3      bilberry 12 1       3
4    blackberry 11 2       4
5        banana 11 1       5
6     blueberry 11 1       5
7       apricot 10 1       7
8  blackcurrant  9 2       8
9         apple  8 1       9
10      avocado  7 0      10

现在,使用ABC的总和:

df %>% select(name, A, B, C, ABC_rank) %>% arrange(ABC_rank)
           name  A B C ABC_rank
1   bell pepper 14 4 7        1
2  blood orange 14 2 8        2
3    blackberry 11 2 8        3
4       apricot 10 1 7        4
5      bilberry 12 1 5        4
6  blackcurrant  9 2 7        4
7     blueberry 11 1 6        4
8         apple  8 1 8        8
9       avocado  7 0 8        9
10       banana 11 1 3        9

水果apricotbilberryblackcurrantblueberry的总和相同。应用第一个规则,blueberry会成为第7级,因为它们没有编号,这是ABC这三列中最高的。然后,其余三个水果的得分最高,因此bilberry的排名为4,因为该水果在A中的得分最高,为12,然后是apricot,其排名为5。它的数字为10,那么黑醋栗的等级为6。

avocadobananabanana将排在第9位,因为它们在列avacado和{中有两个大于A的值{1}},而鳄梨将升为10级。

预期产量

B

这非常复杂,我不确定解决此问题的最佳解决方案是什么。可能有一些if else语句?

0 个答案:

没有答案