在 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
这与除 aguilri01
的 games
之外的所有值一致 - 我认为这是一个错字,但如果这不正确,请告诉我。
对于降序,你可以这样做:
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 中分组时没有得到小计的主要内容,如果未能解决你的问题,请参考以下文章