在 R 中分组时没有得到小计

Posted

技术标签:

【中文标题】在 R 中分组时没有得到小计【英文标题】:Not getting subtotals when groups in R 【发布时间】:2019-07-20 19:27:37 【问题描述】:

每当一名球员发生变化时,我都需要小计他职业生涯中的三分球次数。

我尝试使用下面的代码进行操作,但没有得到小计。

player <- c('acostma01', 'acostma01', 'acostma01', 'adkinjo01', 'aguilri01', 'aguilri01', 'aguilri01', 'aguilri01', 'aguilri01')
        year <- c(2010,2011,2012,2007,1985,1986,1987,1988,1989)
        games <- c(41,44,45,1,21,28,18,11,36)
        strikeouts <- c(42,46,46,0,74,104,77,16,80)
        bb_data <- data.frame(player, year, games, strikeouts, stringsAsFactors = FALSE)

这是无效的代码。

mets <- select(bb_data, player, year, games, strikeouts) %>% 
group_by(player, year) %>% 
colSums(SO)

这是我想要得到的输出:

player      games strikeouts
acostma01   130   134
adkinjo01   1     0
aguilri01   0     351
Grand Total       485

这是我得到的(数据尾部):

player    team    year  games strikouts
<chr>     <chr>   <int> <int> <int>
swarzan01 NYN      2018    29    31
syndeno01 NYN      2018    25   155
vargaja01 NYN      2018    20    84
wahlbo01  NYN      2018     7     7
wheelza01 NYN      2018    29   179
zamorda01 NYN      2018    16    16

【问题讨论】:

我仍然无法正确显示输出。如果有人能告诉我我做错了什么,我将不胜感激。 @tmfmnk 谢谢。你做了什么? 只是稍微编辑了您的帖子以提高可读性:) @tmfmnk 你是怎么做到的?你有没有在每行输出前添加一定数量的空格? 【参考方案1】:

你可以这样做:

library(tidyverse)

bb_data %>% 
  group_by(player) %>% 
  summarise_at(vars(games, strikeouts), sum) %>%
  add_row(player = 'Grand Total', games = NA, strikeouts = sum(.$strikeouts))

这会给你:

# A tibble: 4 x 3
  player      games strikeouts
  <chr>       <dbl>      <dbl>
1 acostma01     130        134
2 adkinjo01       1          0
3 aguilri01     114        351
4 Grand Total    NA        485

这与除 aguilri01games 之外的所有值一致 - 我认为这是一个错字,但如果这不正确,请告诉我。

对于降序,你可以这样做:

bb_data %>% 
  group_by(player) %>% 
  summarise_at(vars(games, strikeouts), sum) %>%
  arrange(-strikeouts) %>%
  add_row(player = 'Grand Total', games = NA, strikeouts = sum(.$strikeouts))

输出:

# A tibble: 4 x 3
  player      games strikeouts
  <chr>       <dbl>      <dbl>
1 aguilri01     114        351
2 acostma01     130        134
3 adkinjo01       1          0
4 Grand Total    NA        485

如果还包括所玩的赛季,您可以尝试:

bb_data %>% 
  group_by(player) %>% 
  mutate(seasons_played = n_distinct(year)) %>%
  group_by(player, seasons_played) %>%
  summarise_at(vars(games, strikeouts), sum) %>% 
  arrange(-strikeouts) %>%
  ungroup() %>%
  add_row(player = 'Grand Total', games = NA, seasons_played = NA, strikeouts = sum(.$strikeouts))

【讨论】:

@这是一个错字。感谢您引起我的注意。我正在研究您的代码,以了解它是如何运作良好的。 我怎样才能让三振按降序出现? 很高兴听到!如果有帮助,请考虑接受和/或投票。【参考方案2】:

如果您不关心年份列开始求和,您可以这样做:

 library(data.table)
 data = setDT(bb_data)[, c(lapply(.SD, sum), .N), by =player]

.N 允许您按玩家计算行数(年数)。

然后您可以订购它(使用- 使其减少):

data[order(-data$strikeouts)]

你得到这个结果:

1: aguilri01 9935   114        351 5
2: acostma01 6033   130        134 3
3: adkinjo01 2007     1          0 1

【讨论】:

我对年份列真正感兴趣但没有将其包含在我的问题记录中,因为我认为在输出中为每个球员包含多少个赛季可能会很复杂他扮演。例如,对于 adkinjo01,这将是一个。这很容易做到吗? 如果你有逐年的行,你可以这样做:setDT(bb_data)[, .N, by =player] 按玩家计算行数 我怎样才能让三振按降序出现? 您可以直接与setDT(bb_data)[, c(lapply(.SD,sum), .N), by =player] 一起拥有两者 之后可以排序,函数order

以上是关于在 R 中分组时没有得到小计的主要内容,如果未能解决你的问题,请参考以下文章

jQuery tablesorter 仅对子行分组小计

报表设计-分组报表-分组小计

Oracle如何分组排序?

SQL Server 2008 如何对分组进行小计

sql 分组小计与合计语法

Oracle 中总计和小计使用的函数