如何计算 tibble 或数据框中的值以产生新的输出 table?

How to count the values in a tibble or data frame to produce a new output table?

我有以下代码:

gm <- c("Alex", "Ashton", "Brett", "Chris", "Dave", "Ian", "Jack", "Jon", "Katz", "Mikulich", "Nate", "Todd")

year <- (2012:2019)

# podium placement, by year
first <- c("Mikulich", "Nate", "Nate", "Chris", "Nate", "Nate", "Dave", "Dave")
second <- c("Jon", "Alex", "Ian", "Todd", "Jon", "Chris", "Jon", "Jon")
third <- c("Katz", "Katz", "Jack", "Dave", "Katz", "Katz", "Chris", "Todd")

podium <- tibble(year, first, second, third)

生成以下小标题,podium

year    first       second    third
<int>   <chr>       <chr>     <chr>

2012    Mikulich    Jon       Katz  
2013    Nate        Alex      Katz  
2014    Nate        Ian       Jack  
2015    Chris       Ross      Dave  
2016    Nate        Jon       Katz  
2017    Nate        Chris     Katz  
2018    Dave        Jon       Chris 
2019    Dave        Jon       Ross

我想要一个 tibble 或数据框 (12x4) 来列出每个 GM 并将前 3 名完成的次数计算到如下所示的输出中:

GM         first    second    third
<chr>      <int>    <int>     <int>

Alex       0        1         0
Ashton     0        0         0
Brett      0        0         0
Chris      1        1         1
Dave       2        0         1
Ian        0        1         0
Jack       0        0         1
Jon        0        4         0
Katz       0        0         4
Mikulich   1        0         0
Nate       4        0         0
Todd       0        1         1

我可以使用 podium %>% count(first) 来获得单独的分布,但我想知道是否有更有效的方法来创建整个 table。

podium %>% count(first):

first      n
<chr>      <int>

Chris      1
Dave       2
Mikulich   1
Nate       4

我们可以使用 pivot_longer 重塑为 'long' 格式,然后执行 count 并将其重塑回 'wide'

library(dplyr)
library(tidyr)
podium %>%
    pivot_longer(cols = -year, values_to = 'GM') %>%
    count(name, GM) %>% 
    pivot_wider(names_from = name, values_from = n, values_fill = list(n = 0))
# A tibble: 10 x 4
#   GM       first second third
#   <chr>    <int>  <int> <int>
# 1 Chris        1      1     1
# 2 Dave         2      0     1
# 3 Mikulich     1      0     0
# 4 Nate         4      0     0
# 5 Alex         0      1     0
# 6 Ian          0      1     0
# 7 Jon          0      4     0
# 8 Todd         0      1     1
# 9 Jack         0      0     1
#10 Katz         0      0     4