【问题标题】:How to count the values in a tibble or data frame to produce a new output table?如何计算 tibble 或数据框中的值以生成新的输出表?
【发布时间】:2020-11-30 19:38:34
【问题描述】:

我有以下代码:

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 %&gt;% count(first) 来获得单独的分布,但我想知道是否有更有效的方法来创建整个表。

podium %&gt;% count(first):

first      n
<chr>      <int>

Chris      1
Dave       2
Mikulich   1
Nate       4

【问题讨论】:

  • 你能查一下length(unique(unlist(podium[-1])))# [1] 10

标签: r dataframe tidyverse tibble


【解决方案1】:

我们可以使用pivot_longer 重新整形为“长”格式,然后执行count 并将其重新整形为“宽”

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

【讨论】:

  • 谢谢,帮助很大!唯一缺少的是它不包括从未进入前三名的GM。我希望我不必重新创建一组全新的数据。
  • @ACH 从显示的数据中,我只得到了 10 个独特的元素,即 podium %&gt;% pivot_longer(cols = -year, values_to = 'GM') %&gt;% distinct(GM) %&gt;% nrow# [1] 10
猜你喜欢
  • 1970-01-01
  • 2012-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多